1. std::mutex
是什么?
std::mutex
是 C++ 标准库中提供的 互斥锁(mutex = mutual exclusion) 类型,用于防止多个线程同时访问共享资源,从而避免数据竞争(data race)。- 它属于 C++11 引入的线程库,需要头文件
<mutex>
。 - 所有操作系统底层的互斥机制(如 POSIX pthread_mutex)在 C++11 中被封装成了标准类接口,使用更方便更安全。
2. 头文件与定义
#include <mutex>std::mutex my_mutex;
- 多个线程共享同一个
std::mutex
实例,用于保护同一段共享资源。 - 每次访问共享数据时,应先
lock()
,访问完后要 unlock()
。
3. 基本用法(手动加锁 / 解锁)
#include <iostream>
#include <thread>
#include <mutex>std::mutex m;void safe_print(const std::string& msg) {m.lock(); std::cout << msg << "\n";m.unlock();
}
⚠️ 注意:
- 如果函数中 抛出异常 或 提前返回,
unlock()
可能不会被调用 → 导致死锁。
4. 推荐写法:使用 std::lock_guard
自动管理锁
void safe_print(const std::string& msg) {std::lock_guard<std::mutex> lock(m); std::cout << msg << "\n";
}
std::lock_guard
是 RAII(资源获取即初始化) 模式,当 lock 离开作用域时自动释放锁,自动释放资源,更安全。- 它的构造函数会立即调用
mutex.lock()
,析构函数会自动调用 mutex.unlock()
,因此不需要手动调用 unlock()
。