可以在memory_order_release之前重新排序操作吗?

时间:2016-01-19 08:12:09

标签: c++ atomic

可以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);
}

1 个答案:

答案 0 :(得分:2)

标准没有根据如何围绕它们进行操作来定义内存栅栏 它定义了在满足正确条件时,释放围栏(或操作)如何与同步获取围栅(或操作)。

在您的示例中,如果获取操作观察到y存储的值,则可以保证它还会观察x存储的值。 在这些条件下,商店前往x的商店会在商店之前订购y

除此之外,很难推测围栏如何强制排序,因为在 as-if 规则下会发生很多事情。