我目前正在与另一位开发者辩论,他向我保证以下 C++ 语句是原子性的:
x |= 0x1; // x is shared by multiple threads
使用VC++11在发布模式下编译,将生成以下汇编代码:
01121270 or dword ptr ds:[1124430h],1
另一位开发者说位运算是原子操作,因此线程安全。但我的经验表明,在英特尔i7处理器上不是这样的。
我以为在多核处理器上,任何共享内存写入都是不安全的,因为每个处理器缓存都是独立的。但是,经过更多的研究,似乎x86处理器在处理器/核之间的内存操作顺序方面提供了一些保证,这表明它应该是安全的……但根据我的经验,这似乎并不是这种情况。
由于我没有权威的知识,很难为自己辩护,甚至难以确定自己是正确的。
std::atomic<int>
也没有任何缺点,它具有保证原子性的operator|=
,因此您应该这样做。 - Wintermutelock or dword ptr ds:[11224430h],1
。但我手头没有参考资料。如果你使用std::atomic <int>
,它会编译成什么? - davmac