首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

为啥对全局变量自增不用一条INC指令搞定,却用了三条指令

2013-12-02 
为什么对全局变量自增不用一条INC指令搞定,却用了三条指令?今天看深入理解计算机系统的时候看到:两个线

为什么对全局变量自增不用一条INC指令搞定,却用了三条指令?
为啥对全局变量自增不用一条INC指令搞定,却用了三条指令
今天看<深入理解计算机系统>的时候看到:两个线程对同一全局变量进行自增操作的时候,由于自增分为三条指令,所以如果两个线程不加同步会产生问题,假如我有一全局变量叫abc,C语言中abc++;这句话被汇编成三句指令:


movl    abc, %eax  //load
addl    $1, %eax   //update
movl    %eax, abc  //store

我就纳闷了,为什么不直接用inc指令直接搞定:
incl abc
是不是不能这样用啊,还是有什么其他原因,这样用的话可以避免线程竞争的问题么?
[解决办法]
应该是编译器没有优化吧
你看看 release 还是不是
[解决办法]
incl 是条伪指令吧,反汇编自动展开,不会显示伪指令
[解决办法]
没优化把,把++放前边试试
[解决办法]
引用:
引用:没优化把,把++放前边试试
用了第二级优化:
gcc -O2 -S test.c

发现自增被优化成一条语句:
addl    $1, abc

那两个线程不加同步,同时执行这条语句还有没有问题?


有问题, 必须使用 lock 前缀, 以及 memory barrier .. incl 也不比 load-add-store 快..

用 gcc 用  __sync_fetch_and_add 做这件事情, M$WIN 下用 InterlockedXXXX .
[解决办法]
x86 下, 一条指令对一个核是原子操作, 不过现在不都是多核么, 并且现在的编译器优化能力很强的, 不加 memory barrier , 根本就没法控制代码里读写内存的顺序, 到时候就是各种诡异的错误.

热点排行