我相信以下代码以原子方式增加了变量var的值。
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Atomic-Builtins.html
volatile int var = 0;
__sync_fetch_and_add( &var, 1 )
我理解上述代码的逻辑如下:
- 加载变量var的地址
- 以原子方式将数字1写入变量var - 通过寄存器/缓存等方式
然而,我怀疑以下操作是否也是原子操作
volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )
由于它可能被解释为
- 加载变量var的地址
- 将变量num的值加载到寄存器中
- 将该值写入变量var。
在执行#3之前,但在执行#2之后, CPU /线程被中断并且另一个CPU /线程更新了 变量num的值。
换句话说, 当使用gcc的_sync ()*()函数时, 我可以使用变量而不是常量作为第二个参数吗?
这不会破坏原子性吗?
num
只是一个值,没有任何魔法参与,也没有原子性。 - Pavel Šimerda