y.store
可以重新排序到 x.store
之前吗?因为标准规定在 memory_order_release
之前发生的任何原子操作都不能重新排序到 memory_order_release
之后,但没有规定发生在 memory_order_release
之后的任何操作都不能重新排序到之前内存_顺序_释放
。
如果我能发生这种情况,那么《行动手册中的 c++ 并发》中的 list 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);
}
最佳答案
该标准没有根据内存栅栏周围的操作排序方式来定义内存栅栏。
它定义了在满足正确条件时释放栅栏(或操作)如何与获取栅栏(或操作)同步。
在您的示例中,如果获取操作观察到 y
存储的值,则可以保证它也观察到 x
存储的值。
在这些条件下,存储到x
的顺序先于存储到y
的顺序。
除此之外,很难推测栅栏如何强制排序,因为在as-if规则下可能会发生很多事情。
关于c++ - 操作可以重新排序到memory_order_release之前吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34871517/