在 C++ 多线程编程中,std::atomic(原子操作)是实现无锁编程(Lock-Free)和轻量级同步的核心机制。它定义在 <atomic> 头文件中。
1. 为什么要用 Atomic?
在多线程环境下,简单的 i++ 操作其实包含三个步骤:
- Read: 从内存读取
i的值到寄存器。 - Modify: 在寄存器中将值加 1。
- Write: 将新值写回内存。
如果没有加锁或使用原子变量,两个线程同时执行 i++,可能会导致所谓的数据竞争(Data Race),也就是丢失更新。
Atomic 的作用: 保证上述 Read-Modify-Write 过程合并为一个不可打断的硬件指令(如 x86 的 lock add),从而保证线程安全。
2. 基础用法
最常用的场景是计数器或标志位。
#include <iostream>
#include <atomic>
#include <thread>
#include <vector>
// 定义一个原子整型,初始化为 0
std::atomic<int> counter(0);
void work() {
for (int i = 0; i < 10000; ++i) {
counter++; // 原子自增,等价于 counter.fetch_add(1)
}
}
int main() {
std::thread t1(work);
std::thread t2(work);
t1.join();
t();
std::cout << << counter << std::endl;
;
}


