c++ - c++ operator |= atomic 是多核处理器吗?

标签 c++ multithreading concurrency multiprocessing atomic

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

x |= 0x1; // x is shared by multiple threads

在 Release模式下用 VC++11 编译生成以下程序集:

01121270  or          dword ptr ds:[1124430h],1

另一个开发者说位操作是原子的,因此是线程安全的。我对英特尔 i7 处理器的体验与此相反。

我认为对于多核处理器,任何共享内存写入都是不安全的,因为有单独的处理器缓存。但经过更多研究后,似乎 x86 处理器提供了一些与处理器/内核之间的内存操作顺序相关的保证,这表明它应该是安全的......同样,这不是根据我的经验,情况似乎是这样。

由于我没有关于这类事情的权威知识,所以我很难提出我的理由,甚至很难相信我是对的。

最佳答案

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

来自 C++11 的支持引述:

1.10/5:

The library defines a number of atomic operations (Clause 29) and operations on mutexes (Clause 30) that are specially identified as synchronization operations. ...

第 29 条介绍了 std::atomic 和相关函数。它没有将基本类型指定为原子类型。

1.10/21:

The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior. ...

关于c++ - c++ operator |= atomic 是多核处理器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29099094/

相关文章:

c++ - 是否可以在多 GPU 机器上执行 CUDA 程序的多个实例?

c++ - 在C++多线程环境中使用写时复制

c++ - 不能像 store 一样在 x86 上放宽原子 fetch_add 重新排序,稍后加载?

c++ - c++ 多线程递归调用终止

go - 同时从两个不同的 goroutine 调用一个方法是否安全?

java - 不同 JVM 之间共享的映射

c++ - 无法更新Text Edit Text QT

c++ - 我想知道如何以及在何处可以在 C++ 中使用 "cerr"?

java - 当 writeLock 锁定时,ReentrantReadWriteLock 是否会读取?

c++ - 商店 Fl :Button value from callback (FLTK)