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

时间:2019-02-21 12:43:53

标签: c++ multithreading c++11 atomic 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

我了解到,如果线程3读取线程1写入的值,则释放和获取操作将与同步,并且A的效果对于线程3是可见的。 > 但是,如果是这样的话:

  • x的修改顺序为1、2
  • thread3读取线程2写入的值,因此2 happens-before 3。

1和3之间是否存在先发关系?
还是从本质上讲,修饰顺序是否有助于先发生关系?

3 个答案:

答案 0 :(得分:3)

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

来自[atomics.order]/2

  

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

...不幸的是,根据[intro.races]/5,操作2不在以操作1为首的释放顺序中:

  

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

结果,我们无法在操作1和其他操作之间构建任何inter-thread happens-before relationship,因此在操作1和操作3之间没有happens-before relationship

答案 1 :(得分:1)

如果我正确理解了您的问题,则不会因使用哪种内存排序而对整体排序产生额外的保证。完全没有任何阻塞可以允许这种情况发生。

答案 2 :(得分:-1)

在您的示例中,您显示了线程1和线程2都以完全相同的方式在x上运行。因此,线程1和线程3之间的关系应该与线程2和线程3之间的关系完全相同。

您的示例中 not 不会显示任何会限制这三个操作实际发生顺序的代码行。换句话说,仅通过查看这三个语句,就无法说出加载操作是返回1还是2还是返回某个先前的x值。