rsy*_*640 5 c++ multithreading atomic c++11 happens-before
// Thread 1
// do A
x.store(1, std::memory_order_release); // operation1
// Thread 2
// do B
x.store(2, std::memory_order_release); // operation2
// Thread 3
x.load(std::memory_order_acquire); // operation3
Run Code Online (Sandbox Code Playgroud)
我知道,如果线程3读取线程1写入的值,则释放和获取操作将与同步,并且的效果A对线程3可见。
但是,如果是这样的话:
x是1、21和3之间是否存在事前关系?
还是本质上,修改顺序有助于事前发生关系?
不会。操作 1 和操作 3 之间没有发生之前的关系。
对原子对象 M 执行释放操作的原子操作 A 与对 M 执行获取操作的原子操作 B 同步,并从以 A 为首的释放序列中的任何副作用中获取其值。
...不幸的是,根据[intro.races]/5 ,操作 2 并不在以操作 1 为首的发布序列中:
以原子对象 M 上的释放操作 A 为首的释放序列是 M 的修改顺序中副作用的最大连续子序列,其中第一个操作是 A,后续的每个操作都是原子读-修改-写手术。
因此,我们无法在操作1和其他操作之间建立任何线程间的happens-before关系,因此操作1和操作3之间不存在happens-before关系。
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |