1. Atomic 与 Volatile 的基本概念
1.1 Atomic 的原子性本质
atomic(原子性)是 C++11 引入的并发编程基石之一,它表示不可分割的操作。想象一下银行转账操作:要么全部完成,要么完全不发生,这就是原子性的本质。
#include <atomic>
std::atomic<int> accountBalance(1000); // 原子整型变量
原子类型的所有成员函数(包括构成 RMW(Read-Modify-Write)操作的那些)都被其他线程视为不可分割的单一操作。这意味着:
- 不会有线程看到"中间状态"
- 操作要么完全发生,要么完全不发生
- 保证内存顺序(memory ordering)语义
1.2 Volatile 的特殊内存语义
volatile关键字的历史更为悠久,它告诉编译器:这个内存位置可能在任何时候被外部因素改变,因此:
volatile int sensorValue; // 可能被硬件改变的变量
volatile的核心特性:
- 禁止编译器优化:确保每次访问都真实发生
- 不保证原子性:对多线程并发访问没有保护
- 不保证内存可见性:没有跨线程的内存同步保证
2. 多线程环境下的表现对比
2.1 Atomic 的线程安全保障
让我们通过一个经典示例展示 atomic 如何保证线程安全:
std::atomic<int> counter(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
counter++; // 原子操作
}
}
// 启动 10 个线程
std::vector<std::thread> threads;
for ( i = ; i < ; ++i) {
threads.(increment);
}
(& t : threads) {
t.();
}
std::cout << << counter << std::endl;


