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处理器提供了与处理器/内核之间的内存操作顺序相关的一些保证,这表明它应该是安全的......再次,我的情况似乎并非如此.经验.
由于我对这些事情没有权威性的知识,所以我很难说出我的理由,甚至不相信我是对的.
不,绝对不能保证是原子的.它是否使用可单独执行的指令(序列)实现取决于编译器和平台.但从标准的角度来看,它不是原子的; 因此,如果一个线程perfroms x |= 0x1;
和另一个线程访问x
没有同步点,它是未定义的行为(数据竞争).
支持C++ 11中的引号:
1.10/5:
该库定义了许多原子操作(第29条)和对互斥锁(第30条)的操作,这些操作被特别标识为同步操作....
第29条介绍std::atomic
及相关职能.它没有将基本类型指定为原子类型.
1.10/21:
程序的执行包含数据竞争,如果它在不同的线程中包含两个冲突的动作,其中至少有一个不是原子的,并且都不会在另一个之前发生.任何此类数据争用都会导致未定义的行为....
归档时间: |
|
查看次数: |
285 次 |
最近记录: |