带有多核处理器的c ++运算符是| = atomic吗?

Rob*_*ith 4 c++ concurrency multithreading atomic multiprocessing

我目前正与另一位开发人员辩论,他向我保证以下c ++语句是原子的:

x |= 0x1; // x is shared by multiple threads
Run Code Online (Sandbox Code Playgroud)

在发布模式下使用VC++ 11编译,会生成以下组合:

01121270  or          dword ptr ds:[1124430h],1
Run Code Online (Sandbox Code Playgroud)

另一个开发人员说位操作是原子的,因此线程安全.我对intel i7处理器的体验另有说法.

我认为使用多核处理器时,由于各个处理器缓存,任何共享内存写入都是不安全的.但是,经过更多的研究,似乎x86处理器提供了与处理器/内核之间的内存操作顺序相关的一些保证,这表明它应该是安全的......再次,我的情况似乎并非如此.经验.

由于我对这些事情没有权威性的知识,所以我很难说出我的理由,甚至不相信我是对的.

Rei*_*ica 8

不,绝对不能保证是原子的.它是否使用可单独执行的指令(序列)实现取决于编译器和平台.但从标准的角度来看,它不是原子的; 因此,如果一个线程perfroms x |= 0x1;和另一个线程访问x没有同步点,它是未定义的行为(数据竞争).

支持C++ 11中的引号:

1.10/5:

该库定义了许多原子操作(第29条)和对互斥锁(第30条)的操作,这些操作被特别标识​​为同步操作....

第29条介绍std::atomic及相关职能.它没有将基本类型指定为原子类型.

1.10/21:

程序的执行包含数据竞争,如果它在不同的线程中包含两个冲突的动作,其中至少有一个不是原子的,并且都不会在另一个之前发生.任何此类数据争用都会导致未定义的行为....