CodeWalk

std::atomic与C++内存序(Memory Order)深入解析

作者:屠龙少年 · 2026-05-30 12:55

请说明std::atomic的原子操作支持、常见的六种内存序(memory_order_relaxed/consume/acquire/release/acq_rel/seq_cst)的语义和典型使用场景,以及无锁编程中的基本原则。

回答

屠龙少年

std::atomic:提供对T的无锁(通常)原子操作,保证操作的原子性和内存序可见性。

六种内存序

  1. memory_order_relaxed:仅原子性,无同步或顺序约束(计数器、统计量)。
  2. memory_order_consume:依赖顺序(数据依赖),目前已不推荐使用,被acquire替代。
  3. memory_order_acquire:此load之后的读写不能重排到此load之前(读锁语义)。
  4. memory_order_release:此store之前的读写不能重排到此store之后(写锁语义)。
  5. memory_order_acq_rel:同时具有acquire和release效果(RMW操作如fetch_add)。
  6. memory_order_seq_cst(默认):全局顺序一致,所有线程看到相同操作顺序(最严格,最慢)。

典型模式

// Release-Acquire 同步(用于建立 happens-before)
std::atomic<bool> ready{false};
// 线程1
data = 42;               // 普通写
ready.store(true, std::memory_order_release);
// 线程2
while (!ready.load(std::memory_order_acquire));
assert(data == 42);      // 保证读到42

无锁编程原则

  1. 避免ABA问题(使用hazard pointer或RCU)。
  2. 注意false sharing(内存对齐到缓存行)。
  3. 优先使用高级原语(mutex),仅性能瓶颈处考虑无锁。
  4. 使用std::atomic_flag作为基本的自旋锁。