修改顺序是否有助于事前发生关系?

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、2
  • 线程3读取线程2写入的值,因此2 发生在 3 之前

1和3之间是否存在事前关系?
还是本质上,修改顺序有助于事前发生关系?

xsk*_*xzr 4

不会。操作 1 和操作 3 之间没有发生之前的关系。

来自[atomics.order]/2

对原子对象 M 执行释放操作的原子操作 A 与对 M 执行获取操作的原子操作 B 同步,并从以 A 为首的释放序列中的任何副作用中获取其值。

...不幸的是,根据[intro.races]/5 ,操作 2 并不在以操作 1 为首的发布序列中:

以原子对象 M 上的释放操作 A 为首的释放序列是 M 的修改顺序中副作用的最大连续子序列,其中第一个操作是 A,后续的每个操作都是原子读-修改-写手术

因此,我们无法在操作1和其他操作之间建立任何线程间的happens-before关系,因此操作1和操作3之间不存在happens-before关系。