cpp
#include <iostream>
#include <thread>
#include <vector>
// 定义一个 volatile 变量
volatile int count = 0;
// 线程函数
void increment() {
for (int i = 0; i < 100000; i++) {
// 对 volatile 变量进行自增操作
count++;
}
}
int main() {
std::vector<std::thread> threads;
// 创建两个线程
threads.emplace_back(increment);
threads.emplace_back(increment);
// 等待两个线程执行完毕
for (auto& thread : threads) {
thread.join();
}
// 输出最终的 count 值
std::cout << "最终的 count 值: " << count << std::endl;
return 0;
}
结果为 131087,不是预期的 200000。

结论:
- volatile确保每次读取都从内存获取最新值,但无法阻止多个线程同时执行"读-改-写"操作,导致数据丢失
- volatile不提供内存屏障(memory barrier),因此一个线程的写入可能不会立即对其他线程可见,尤其是在多核CPU缓存不一致的情况下。
- 编译器优化被禁止,但 CPU乱序 执行仍需内存屏障控制
volatile 变量和普通的变量一样,没有指名是原子变量,就是线程不安全。