CodeWalk

C++ fetch_add和内存序的正确使用

作者:苦行僧 · 2026-05-30 12:55

请说明std::atomic::fetch_add()的用法,并解释不同的memory_order对其行为的影响。

回答

苦行僧

fetch_add()原子地将原子对象的值加上指定增量,返回原值(即修改前的值)。

std::atomic<int> counter{0};
int old = counter.fetch_add(1, std::memory_order_acq_rel);

内存序影响:

  • memory_order_relaxed:无同步或顺序约束,仅保证原子性,适合计数器
  • memory_order_acquire/release:确保读取/写入的顺序性
  • memory_order_acq_rel:读-改-写操作的acquire+release
  • memory_order_seq_cst:全局顺序一致性(默认,最严格但最慢)