C++ 多线程同步:互斥锁(mutex)实战
在多线程编程中,共享资源访问是高频场景,也是最容易踩坑的地方。当多个线程同时读写同一块内存时,数据竞争(Data Race)几乎不可避免,轻则结果错误,重则程序崩溃。解决这个问题的核心手段就是线程同步,而互斥锁(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;
}
运行你会发现,最终结果往往小于 200000。因为 count++ 实际上是'读 - 改 - 写'三步,线程切换会打断这个过程。这就是典型的线程安全问题。
std::mutex 与 lock_guard
C++11 引入了 <mutex> 头文件。最核心的类是 std::mutex。它提供 lock() 和 unlock() 接口,但手动管理生命周期风险很大——一旦异常抛出,锁可能无法释放,导致死锁。
所以实际开发中,我们更推荐 std::lock_guard。它基于 RAII 机制,构造时自动加锁,析构时自动解锁。哪怕代码中途抛出异常,锁也能被安全释放。
改造后的代码
加上锁之后,逻辑就清晰了:


