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。
std::mutex 的核心接口
lock():获取互斥锁。如果锁已被其他线程占用,当前线程会阻塞等待。unlock():释放互斥锁。必须与lock()成对使用。


