原子同步的各种语义间关系

表的含义是:

左边 = 写线程使用的内存序
上边 = 读线程使用的内存序

如果格子里是 ✅,说明:

形成 synchronizes-with
⇒ 产生 happens-before
⇒ 写线程之前的操作对读线程可见

C++ 原子内存序同步矩阵

store ↓ / load → relaxed acquire seq_cst
relaxed ❌ ❌ ❌
release ❌ ✅ ✅
seq_cst ❌ ✅ ✅

解释:

release + acquire   → 最常用同步
release + seq_cst   → 也同步
seq_cst + acquire   → 也同步
seq_cst + seq_cst   → 最强同步

RMW(读改写)操作矩阵

对于:

fetch_add
exchange
compare_exchange

如果使用:

memory_order_acq_rel

它同时具备:

acquire + release

因此矩阵变成:

RMW ↓ / load → relaxed acquire seq_cst
relaxed ❌ ❌ ❌
release ❌ ✅ ✅
acquire ❌ ❌ ❌
acq_rel ❌ ✅ ✅
seq_cst ❌ ✅ ✅

最重要的四个规则(工程必记)

规则1

release → acquire

形成同步


规则2

release → relaxed

不会同步


规则3

relaxed → acquire

不会同步


规则4

seq_cst

总是兼容 acquire / release


实际工程中的典型写法

SPSC 队列

生产者:

tail.store(newTail, std::memory_order_release);

消费者:

tail.load(std::memory_order_acquire);

flag 通知

ready.store(true, std::memory_order_release);
if (ready.load(std::memory_order_acquire))

计数器

counter.fetch_add(1, std::memory_order_relaxed);
posted @ 2026-03-06 14:00  BlackSnow  阅读(24)  评论(0)    收藏  举报