博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
x86指令集中lock前缀的意义
阅读量:5786 次
发布时间:2019-06-18

本文共 1042 字,大约阅读时间需要 3 分钟。

接上篇( ),对一个变量进行加法操作,可以是3条指令,也可以是1条指令。区别在于,1条指令属于原子操作,不会被打断,那是不是只要1条指令的形式,多线程之间就不需要加锁了呢?我们先试试看。(以下代码仅适用于x86平台,gcc编译器)

#include 
#include
int count = 0;void *add(void *arg){ int i; for (i = 0; i< 10000; i++) { asm( "addl $1, %0 \n" : : "m"(count) : ); }}int main(int argc, char *argv[]){ pthread_t t1, t2; pthread_create(&t1, NULL, add, NULL); pthread_create(&t2, NULL, add, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); printf("%d\n", count); return 0;}

然后运行:

images51

这是在一个多核处理器且支持对称多处理的系统上运行的结果。可见很大概率上,仍然存在同步问题。那为什么某些情况又能得到20000这个正确结果呢?鬼才知道,只能靠瞎猜。

多核多线程情况下,即便修改操作是单条指令,由于存在并发运行,也不能保证其原子性。幸好有taskset这个程序,可以设置cpu亲和性,我们先将其设置到单核试试看。

images52

嗯貌似完美。

那如果亲和性设置成两个核心呢?

images53

果然,有一定概率出现同步问题。

好了,文章要结束了,总得回到标题,类似电影要到时间了,反派再强大,也得找个方式被灭掉。lock前缀的意义在于,在多核且支持对称多处理的系统上,对于接下来的那条指令,能够保证其原子性。注意lock并不是能够往各个指令面前加的。至于如何保证了原子性,鬼才知道。

我们把add函数改写下:

for (i = 0; i< 10000; i++) {        asm(            "lock \n"            "addl $1, %0 \n"            : : "m"(count) : );    }

再运行几遍:

images54

好了,像是那么回事了。

转载地址:http://quxyx.baihongyu.com/

你可能感兴趣的文章
python的图形模块PIL小记
查看>>
shell变量子串
查看>>
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
Unity Shaders and Effects Cookbook (3-5) 金属软高光
查看>>
31-hadoop-hbase-mapreduce操作hbase
查看>>
C++ 代码风格准则:POD
查看>>
linux-友好显示文件大小
查看>>
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
查看>>