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_cst 的 std::atomic_thread_fence 操作 X 先序于 B,则 B 观测到以下之一:
- 在单独全序中先出现于 X 的上个 M 的
memory_order_seq_cst修改, - 在单独全序中后出现于它的某次 M 的无关联修改。
设有 M 上的一对原子操作,称之为 A 和 B,这里 A 写入、B 读取 M 的值,若存在二个 memory_order_seq_cst 的 std::atomic_thread_fence X 和 Y,且若 A 先序于 X,Y 先序于 B,且 X 在单独全序中先出现于 Y,则 B 观测到二者之一:
- A 的效应,
- 在 M 的修改顺序中后出现于 A 的某次无关联修改。
设有 M 上的一对原子操作,称之为 A 和 B,若符合下列条件之一,则 M 的修改顺序中 B 先发生于 A:
- 存在一个
memory_order_seq_cst的 std::atomic_thread_fence X,它满足 A 先序于 X,且 X 在单独全序中先出现于 B, - 或者,存在一个
memory_order_seq_cst的 std::atomic_thread_fence Y,它满足 Y 先序于 B,且 A 在单独全序中先出现于 Y, - 或者,存在
memory_order_seq_cst的 std::atomic_thread_fence X 和 Y,它们满足 A 先序于 X,Y 先序于 B,且 X 在单独全序中先出现于 Y。
注意这表明:
1) 一旦出现未标记
memory_order_seq_cst 的原子操作,则立即丧失序列一致性,2) 序列一致栅栏仅为栅栏自身建立全序,而不为通常情况下的原子操作建立(先序于 不是跨线程关系,不同于先发生于)