std::atomic 是 C++ 无锁编程核心工具,提供原子读写、CAS 操作及内存序控制,需配合正确模式使用;支持基本类型,常用 load/store、fetch_add、compare_exchange_weak/strong 等操作,并注意 is_lock_free、内存序选择与避免忙等待等陷阱。

在 C++ 中,std::atomic 是实现无锁(lock-free)编程的核心工具,它保证对变量的读、写、修改等操作是原子的——即不会被线程调度打断,从而避免数据竞争。它不是“万能锁替代品”,而是需要配合正确的使用模式(如 compare-and-swap 循环、内存序控制)才能安全高效地工作。
基础用法:声明与常用操作
最简单的场景是用 std::atomic 替代普通变量做计数或标志位:
- 声明:支持基本类型(
int、bool、pointer等),例如std::atomic<int> counter{0};</int> - 读写:用
.load()和.store(val),比直接赋值更明确语义;也可用=和++(但注意:++是读-改-写,有潜在开销) - 原子加减:
counter.fetch_add(1)返回旧值;counter += 1返回新值 - 布尔标志:
std::atomic<bool> ready{false}; ready.store(true); if (ready.load()) { ... }</bool>
关键进阶:compare_exchange_weak / strong(CAS)
这是无锁结构(如栈、队列)的基石。它尝试“比较并交换”:仅当当前值等于预期值时,才把新值写入,并返回是否成功。
bool success = atom.compare_exchange_weak(expected, desired);- 必须用循环重试(因为 weak 版本可能伪失败):
int expected = atom.load();
while (!atom.compare_exchange_weak(expected, expected + 1)) { /* expected 自动更新为当前值 */ } - strong 版本不伪失败,但可能更慢;weak 更适合循环场景
内存序(memory order)不能忽略
原子操作默认使用 std::memory_order_seq_cst(最强顺序,性能略低)。实际中常需放宽以提升性能,但必须理解其含义:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~