C++ 多线程同步:互斥锁 mutex 实战
在多线程环境下,多个线程同时读写共享资源时,很容易出现数据竞争。比如两个线程同时对一个全局变量做自增操作,最终结果往往小于预期。这是因为 count++ 并非原子操作,指令被交错执行了。解决这类问题的核心就是线程同步。
为什么需要互斥锁
C++11 引入了 <mutex> 头文件,提供了 std::mutex 类。最基础的接口包括 lock() 获取锁,unlock() 释放锁,以及 try_lock() 尝试获取但不阻塞。
手动调用 lock() 和 unlock() 有个隐患:如果中间抛出异常,unlock() 可能不会被执行,导致死锁。所以实际开发中,更推荐基于 RAII 机制的 std::lock_guard。它会在构造时自动加锁,析构时自动解锁,即使发生异常也能保证锁被释放。
实战:修复数据竞争
来看个例子。之前那个计数程序,加上互斥锁后逻辑就清晰了。
#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++; // 临界区代码,此时只有一个线程能执行
}
// lock_guard 析构,自动解锁
}
int main() {
thread t1(increment);
thread t2(increment);
t();
t();
cout << << count << endl;
;
}


