C++ 多线程同步实战:原子操作 atomic 详解
💡 学习目标:掌握 C++ 标准库中原子操作的使用方法,理解原子操作与互斥锁的区别,能够在轻量级同步场景中高效解决数据竞争问题。
💡 学习重点:std::atomic 模板的常用接口、原子操作的特性、原子类型与普通类型的性能对比、原子操作的典型应用场景。
原子操作的引入背景
在之前的章节中我们学习了互斥锁,它通过阻塞线程的方式实现临界区保护。但互斥锁存在上下文切换开销,在一些简单的同步场景中显得过于笨重。比如对单个变量的自增、自减、赋值等操作,我们需要一种更轻量级的同步方案——原子操作。
⚠️ 注意事项:原子操作仅适用于单个变量的简单同步,无法替代互斥锁实现复杂临界区的保护。
举个例子,使用互斥锁保护变量自增:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int count = 0;
mutex mtx;
void increment() {
for (int i = 0; i < 100000; ++i) {
lock_guard<mutex> lock(mtx);
count++;
}
}
int main() {
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
cout << "最终 count 值:" << count << endl;
return 0;
}


