std::atomic 是 C++11 提供的无锁原子操作工具,支持 load/store/exchange/compare_exchange 等操作,需合理选用 memory_order 并注意 lock-free 性、ABA 问题及正确性验证。
std::atomic 是 C++11 引入的核心工具,用于在多线程环境中安全地读写共享变量,无需互斥锁(mutex),从而实现无锁(lock-free)编程。它的关键在于:所有操作都是原子的,不会被线程调度打断,且编译器和 CPU 会按需插入内存屏障,防止重排序导致的数据竞争。
std::atomic
operator T(),默认 memory_order_seq_cst(最强顺序)operator=(val)
下面是一个线程安全的无锁自增计数器,不依赖 mutex:
std::atomiccounter{0}; void increment() { counter.fetch_add(1, std::memory_order_relaxed); }
int get_value() { return counter.load(std::memory_order_acquire); }
这里用 fetch_add 替代 read-modify-write 手动实现,避免竞态。注意:memory_order_relaxed 适用于仅需原子性、不依赖其他内存操作顺序的场景(如计数器);若需同步其他数据,应升级为 acquire/release 或保持默认 seq_cst。
无锁栈依赖 compare_exchange_weak 实现 ABA 问题规避(通常配合 tag pointer 或 hazard pointer,简单版可先忽略 ABA):
struct Node {
int data;
Node* next;
};
std::atomic head{nullptr};
void push(int data) {
Node* node = new Node{data, nullptr};
node->next = head.load(std::memory_order_relaxed);
while (!head.compare_exchange_weak(node->next, node,
std::memory_order_release, std::memory_order_relaxed)) {
// 若 head 已变,node->next 被自动更新为当前 head,继续重试
}
}
pop 类似,但需小心处理内存释放(建议搭配 std::shared_ptr 或专用内存回收机制,否则易出现 use-after-free)。
无锁 ≠ 无脑高效。实际使用中要注意:
:可用 is_lock_free() 检查,例如某些平台下 atomic