Template:cpp/atomic/sequentially-consistent-cpp11

来自cppreference.com

正式而言,

对原子对象 M 进行加载的每个 memory_order_seq_cst 操作 B,均会观测到以下之一:

  • 修改 M 的上个操作 A 的结果,A 在单独全序中先出现于 B,
  • 或者,若存在这种 A,则 B 可能观测到 M 上的某次修改结果,此次修改非 memory_order_seq_cst 而且不先发生于 A,
  • 或者,若不存在这种 A,则 B 可能观测到 M 上的某次无关联修改的结果,此次修改非 memory_order_seq_cst

若存在 memory_order_seq_cststd::atomic_thread_fence 操作 X 先序于 B,则 B 观测到以下之一:

  • 在单独全序中先出现于 X 的上个 M 的 memory_order_seq_cst 修改,
  • 在单独全序中后出现于它的某次 M 的无关联修改。

设有 M 上的一对原子操作,称之为 A 和 B,这里 A 写入、B 读取 M 的值,若存在二个 memory_order_seq_cststd::atomic_thread_fence X 和 Y,且若 A 先序于 X,Y 先序于 B,且 X 在单独全序中先出现于 Y,则 B 观测到二者之一:

  • A 的效应,
  • 在 M 的修改顺序中后出现于 A 的某次无关联修改。

设有 M 上的一对原子操作,称之为 A 和 B,若符合下列条件之一,则 M 的修改顺序中 B 先发生于 A:

  • 存在一个 memory_order_seq_cststd::atomic_thread_fence X,它满足 A 先序于 X,且 X 在单独全序中先出现于 B,
  • 或者,存在一个 memory_order_seq_cststd::atomic_thread_fence Y,它满足 Y 先序于 B,且 A 在单独全序中先出现于 Y,
  • 或者,存在 memory_order_seq_cststd::atomic_thread_fence X 和 Y,它们满足 A 先序于 X,Y 先序于 B,且 X 在单独全序中先出现于 Y。

注意这表明:

1) 一旦出现未标记 memory_order_seq_cst 的原子操作,则立即丧失序列一致性,
2) 序列一致栅栏仅为栅栏自身建立全序,而不为通常情况下的原子操作建立(先序于 不是跨线程关系,不同于先发生于