// 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是否发生在1和3之间的关系之前? 或者本质上,修改顺序是否有助于在关系之前发生?
不,操作1与操作3之间没有发生过关系。
对原子对象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和线程2都以完全相同的方式在x上运行。因此,线程1和线程3之间的关系应该与线程2和线程3之间的关系完全相同。
您的示例未显示任何会限制三个操作实际发生顺序的代码行。换句话说,仅从查看这三个语句,就没有办法说明加载操作是返回1
,还是2
,还是x
的某个先前值。