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);
}
常见陷阱¶
volatile不能替代 atomic。relaxed不建立跨线程可见性顺序。- x86 上看似正确的代码,换到 ARM 可能失败。
- atomic 只能保护变量本身,不自动保护相关对象。
面试高频问题¶
relaxed 有什么用¶
适合只需要原子计数、不依赖它同步其他内存的场景。例如统计请求数。若消费者根据 flag 读取 payload,flag 就不能只用 relaxed。