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

今天看<深入理解计算机系统>的时候看到:两个线程对同一全局变量进行自增操作的时候,由于自增分为三条指令,所以如果两个线程不加同步会产生问题,假如我有一全局变量叫abc,C语言中abc++;这句话被汇编成三句指令:
movl abc, %eax //load
addl $1, %eax //update
movl %eax, abc //store
我就纳闷了,为什么不直接用inc指令直接搞定:
incl abc
是不是不能这样用啊,还是有什么其他原因,这样用的话可以避免线程竞争的问题么?
[解决办法]应该是编译器没有优化吧
你看看 release 还是不是
[解决办法]incl 是条伪指令吧,反汇编自动展开,不会显示伪指令
[解决办法]没优化把,把++放前边试试
[解决办法]有问题, 必须使用 lock 前缀, 以及 memory barrier .. incl 也不比 load-add-store 快..
用 gcc 用 __sync_fetch_and_add 做这件事情, M$WIN 下用 InterlockedXXXX .
[解决办法]x86 下, 一条指令对一个核是原子操作, 不过现在不都是多核么, 并且现在的编译器优化能力很强的, 不加 memory barrier , 根本就没法控制代码里读写内存的顺序, 到时候就是各种诡异的错误.