【发布时间】:2015-05-19 21:09:47
【问题描述】:
我目前正在与另一位开发人员进行辩论,他向我保证以下 c++ 语句是原子的:
x |= 0x1; // x is shared by multiple threads
在发布模式下使用 VC++11 编译,生成以下程序集:
01121270 or dword ptr ds:[1124430h],1
另一位开发人员说位操作是原子的,因此是线程安全的。我使用英特尔 i7 处理器的经验并非如此。
我认为对于多核处理器,任何共享内存写入都是不安全的,因为有单独的处理器缓存。但经过更多研究后,似乎 x86 处理器提供了一些与处理器/内核之间的内存操作顺序相关的保证,这表明它应该是安全的......再次,这并不根据我的经验,似乎是这样。
由于我对这类事情没有权威的了解,我很难提出自己的观点,甚至很难确信自己是对的。
【问题讨论】:
-
这只是平台相关的,不是吗?我认为您应该指定您的平台。
-
某些编译器可能会在某些架构上生成线程安全代码,但不能保证。使用
std::atomic<int>也没有缺点,它有一个operator|=,保证是原子的,所以你应该这样做。 -
我很确定在 x86 架构上需要
lock指令前缀,以确保在多个处理器/内核的情况下的原子性。 IE。它必须是lock or dword ptr ds:[11224430h],1。但我手边没有参考资料。如果你use std::atomic<int>,它会编译成什么? -
对不起,我指的是x86平台
标签: c++ multithreading concurrency multiprocessing atomic