可以y.store
重新排序到x.store
之前吗?因为标准表示任何原子操作发生在memory_order_release
之前无法重新排序到memory_order_release
之后,但没有声明任何操作发生在memory_order_release
无法重新排序到memory_order_release
之前。
如果我可以发生,那么来自行动书中c ++并发的清单5.12示例是错误的吗?
std::atomic<bool> x,y;
std::atomic<int> z;
void write_x_then_y()
{
x.store(true,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_release);
y.store(true,std::memory_order_relaxed);
}
答案 0 :(得分:2)
标准没有根据如何围绕它们进行操作来定义内存栅栏 它定义了在满足正确条件时,释放围栏(或操作)如何与同步获取围栅(或操作)。
在您的示例中,如果获取操作观察到y
存储的值,则可以保证它还会观察x
存储的值。
在这些条件下,商店前往x
的商店会在商店之前订购y
。
除此之外,很难推测围栏如何强制排序,因为在 as-if 规则下会发生很多事情。