跳转至

atomics 与 memory order

是什么 / 解决什么问题

C++ atomics 用于在线程间安全共享数据。低延迟系统需要理解可见性和顺序,而不是只知道 std::atomic “线程安全”。

常用顺序

memory order 含义 常见用途
relaxed 只保证原子性 统计计数、不参与同步
acquire 后续读写不能重排到它之前 消费发布的数据
release 之前读写不能重排到它之后 发布数据
acq_rel acquire + release RMW 操作
seq_cst 全局单一顺序 简单但成本可能更高

发布/消费模式

// producer
payload.x = 42;
ready.store(true, std::memory_order_release);

// consumer
if (ready.load(std::memory_order_acquire)) {
    assert(payload.x == 42);
}

常见陷阱

  1. volatile 不能替代 atomic。
  2. relaxed 不建立跨线程可见性顺序。
  3. x86 上看似正确的代码,换到 ARM 可能失败。
  4. atomic 只能保护变量本身,不自动保护相关对象。

面试高频问题

relaxed 有什么用

适合只需要原子计数、不依赖它同步其他内存的场景。例如统计请求数。若消费者根据 flag 读取 payload,flag 就不能只用 relaxed。