在cppreference.com上的文档中std::memory_order
有一个轻松排序的示例:
轻松订购
标记
memory_order_relaxed
的原子操作不是同步操作;它们不会在并发内存访问之间强加顺序。它们只保证原子性和修改顺序的一致性。例如,x 和 y 最初为零,
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
允许产生 r1 == r2 == 42,因为尽管 A在线程 1中排在B 之前,C 在线程 2 中排在 D之前,但没有什么可以阻止 D 在 y 的修改顺序中出现在 A 之前,而 B 从在 x 的修改顺序中出现在 C 之前。D 对 y 的副作用可能对线程 1 中的负载 A 可见,而 B 对 x 的副作用可能对线程 2 中的负载 C 可见。特别是,如果 D 在 C 中的 C 之前完成,则可能会发生这种情况线程 2,由于编译器重新排序或在运行时。
它说“C 在线程 2 中在 D 之前排序”。
根据排序前的定义,可以在评估顺序中找到,如果 A 在 B 之前排序,则 A 的评估将在 B 的评估开始之前完成。由于线程 2 中 C 在 D 之前排序,因此 C 必须在 D 开始之前完成,因此快照最后一句的条件部分将永远不会满足。