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

问题描述 投票:5回答:3
// 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

我已经明白,如果thread3读取thread1写入的值,则释放和获取操作是同步的,并且A的效果对thread3是可见的。 但如果情况如此:

  • x的修改顺序是1,2
  • thread3读取thread2写入的值,因此2发生在3之前。

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

c++ multithreading c++11 atomic happens-before
3个回答
3
投票

不,操作1与操作3之间没有发生过关系。

来自[atomics.order]/2

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

......不幸的是,根据[intro.races]/5,行动2不在按行动1为首的释放序列中:

由原子对象M上的释放操作A引导的释放序列是M的修改顺序中的副作用的最大连续子序列,其中第一操作是A,并且每个后续操作是原子读 - 修改 - 写操作。

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


1
投票

如果我正确地理解了您的问题,那么由于您使用的内存排序,整体排序没有额外的保证。根本没有阻止允许这种情况发生。


0
投票

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

您的示例未显示任何会限制三个操作实际发生顺序的代码行。换句话说,仅从查看这三个语句,就没有办法说明加载操作是返回1,还是2,还是x的某个先前值。

© www.soinside.com 2019 - 2024. All rights reserved.