C11 原子操作与内存序
更新时间:2026-10-01。配合 c-memory-barrier,本文讲标准原子库而不是手写内联屏障。
一、原子操作
_Atomic 类型上的读写保证不可分割;常用 atomic_fetch_add(计数)、compare_exchange_weak/strong(CAS,无锁算法核心)、exchange。
二、内存序
- relaxed:只保证原子,不排序(独立计数器)。
- acquire/release:release 写之前的操作对 acquire 读到该值者可见(发布/订阅)。
- acq_rel:读改写用。
- seq_cst:最强全局一致,默认但最贵。

三、常见坑
- 用 volatile 代替 atomic。
- 一律 seq_cst 付无谓代价。
- CAS 循环忽略 weak 的伪失败。
- ABA 未加版本号。
小结
总结
C11 <stdatomic.h> 在 _Atomic 类型上提供不可分割的读写(atomic_load/store、fetch_add 计数、compare_exchange 的 CAS——无锁算法核心,注意 weak 会伪失败),而内存序决定可见性与顺序:纯计数器只需 relaxed,发布数据用 release 写 / acquire 读配对,读改写用 acq_rel,只有需要全局一致序才用最贵的 seq_cst——原则是"选能满足需求的最弱内存序";atomic 不能用 volatile 替代,复杂无锁结构还要用版本号防 ABA。