贝利信息

C++如何使用原子操作(std::atomic)?(无锁编程)

日期:2026-01-09 00:00 / 作者:穿越時空
std::atomic是C++无锁编程核心工具,提供原子读写、CAS等操作,支持整型/指针等类型,需用load/store/exchange/compare_exchange等成员函数操作,不支持普通赋值和算术运算符。

在C++中,std::atomic是实现无锁编程的核心工具,它保证对共享变量的读、写、修改操作具有原子性,避免数据竞争,无需互斥锁(如std::mutex)即可安全地在多线程间同步。

基本用法:声明与初始化

使用std::atomic需包含头文件。它是一个模板类,支持整型、指针等可平凡复制(trivially copyable)类型。常用特化包括std::atomicstd::atomicstd::atomic等。

初始化方式有多种:

核心操作:load、store、exchange、compare_exchange

原子变量不支持普通赋值和算术运算符重载(如++),必须调用成员函数完成操作:

示例(无锁计数器递增):

std::atomic counter{0};
int old_val = counter.load();
while (!counter.compare_exchange_weak(old_val, old_val + 1)) {
  // 若被其他线程抢先修改,old_val已更新,继续重试
}

内存序(memory order)控制可见性与重排

默认使用memory_order_seq_cst(顺序一致性),最安全也最慢。根据场景可降级以提升性能:

错误示例:仅用relaxed实现“生产者-消费者”同步会出问题;正确做法是生产者store(..., release),消费者load(..., acquire)

常见陷阱与注意事项