可以将操作重新排序到memory_order_release之前

can operation reorder to before memory_order_release?

本文关键字:memory order 之前 release 排序 操作 新排序      更新时间:2023-10-16

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

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

在您的示例中,如果获取操作观察 y 存储的值,则保证它也观察 x 存储的值。在这些条件下,要x的商店先于商店y

除此之外,很难推测围栏如何强加秩序,因为在假设规则下可能会发生很多事情。