C++ 多线程同步实战:互斥锁(mutex)详解
在多线程编程中,当多个线程同时访问共享资源时,资源竞争问题随之而来。例如两个线程同时对同一个变量进行读写操作,会导致最终结果与预期不符。这种线程安全问题,核心解决手段就是线程同步。
⚠️ 注意:线程不同步会引发数据竞争,造成程序运行结果不可预测,甚至导致崩溃。
为什么要进行线程同步
举个简单的反例,两个线程同时对全局变量 count 进行自增操作:
#include <iostream>
#include <thread>
using namespace std;
int count = 0;
void increment() {
for (int i = 0; i < 100000; ++i) {
count++; // 非原子操作,存在数据竞争
}
}
int main() {
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
cout << "最终 count 值:" << count << endl;
return 0;
}
运行该程序会发现,最终 count 的值大概率小于 200000。这是因为 count++ 不是原子操作,被两个线程交替执行打乱了步骤。
C++ 标准库中的互斥锁
C++11 及以后的标准库提供了 <mutex> 头文件,封装了多种互斥锁相关的类。最基础且常用的就是 std::mutex。
核心接口
lock():获取互斥锁。如果锁已被其他线程占用,当前线程会阻塞等待。unlock():释放互斥锁。必须与 成对使用。


