// 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 1和3之间是否存在先发关系?
还是从本质上讲,修饰顺序是否有助于先发生关系?
答案 0 :(得分:3)
不。操作1和操作3之间没有发生事前关系。
原子操作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
值。>