原子同步的各种语义间关系
表的含义是:
左边 = 写线程使用的内存序
上边 = 读线程使用的内存序
如果格子里是 ✅,说明:
形成 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);

浙公网安备 33010602011771号