c++ - 操作可以重新排序到memory_order_release之前吗?

标签 c++ atomic

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/

相关文章:

c++ - 为什么原子操作需要独占缓存访问?

c++ - 面向侵入式数据结构的面向对象设计

c++ - 有原子 |= 操作吗?

c++ - Boost 库、序列化和符号运算符?

c++ - "+="操作在类型 std::complex<double> 和 __complex__ double 之间不起作用

java - 这个函数是原子函数吗?

java - 实现时间滑动窗口类时使用原子类型的非锁定线程代码

java - AtomicInteger 和 volatile

c++ - 如何确定 bjam 中 cxxflags 的值?还是附加到它?

c++ - 为什么我不能正常初始化 typedef struct string 或 char?