std::mutex是C++11引入的同步机制,用于保护共享数据;2. 通过定义std::mutex对象实现加锁,推荐使用std::lock_guard进行RAII管理,避免手动调用lock/unlock导致死锁。

在C++中,std::mutex 是用于保护共享数据、防止多个线程同时访问造成数据竞争的核心同步机制。它属于 C++11 标准引入的 red"><mutex> 头文件,使用起来简单但需要遵循正确模式。
std::mutex 的创建
std::mutex 不需要显式创建特殊对象,只需在需要保护共享资源的地方定义一个互斥量即可:
std::mutex mtx; // 全局或类成员变量中声明
这个互斥量可以是局部变量(较少见)、全局变量,更常见的是作为类的成员变量,用来保护该类中的共享状态。
立即学习“C++免费学习笔记(深入)”;
std::mutex 的基本使用方法
直接使用 std::mutex 的成员函数 lock() 和 unlock() 可以加锁和解锁,但不推荐手动调用,容易出错(如忘记 unlock 导致死锁)。
推荐使用 std::lock_guard 或 std::unique_lock 实现 RAII 管理,自动加锁和释放。
示例:使用 std::lock_guard 自动管理锁
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int shared_data = 0;
void safe_increment() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard<std::mutex> lock(mtx); // 构造时加锁,析构时自动解锁
++shared_data;
}
}
int main() {
std::thread t1(safe_increment);
std::thread t2(safe_increment);
t1.join();
t2.join();
std::cout << "Final value: " << shared_data << std::endl; // 正确输出 200000
return 0;
}
避免死锁的使用建议
多个互斥量同时使用时,容易因加锁顺序不同导致死锁。解决办法包括:
- 始终以相同顺序获取多个锁
- 使用 std::lock() 一次性锁定多个互斥量,避免中间状态
- 优先使用 std::lock_guard 或 std::scoped_lock(C++17)管理多锁
示例:安全地使用多个互斥量
std::mutex mtx1, mtx2;
void thread_func() {
std::lock(mtx1, mtx2); // 同时锁住两个互斥量,不会死锁
std::lock_guard<std::mutex> lock1(mtx1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mtx2, std::adopt_lock);
// 使用共享资源...
}
基本上就这些。只要记得用 RAII 封装锁,避免手动调用 lock/unlock,就能安全有效地使用 mutex。











