std::mutex用于线程同步,需包含头文件;通过lock()/unlock()手动加解锁易出错,推荐使用std::lock_guard实现RAII自动管理;在多线程中保护临界区,如共享输出,确保同一时间仅一个线程访问,避免数据竞争和输出混乱。

在C++中,std::mutex 是用于保护共享数据、防止多个线程同时访问的关键工具。它定义在
1. 包含头文件并声明互斥锁
使用互斥锁前,需要包含头文件
#include iostream>
#include
std::mutex mtx; // 全局互斥锁
2. 使用 lock() 和 unlock() 手动加锁解锁
可以直接调用 lock() 加锁,操作完后调用 unlock() 解锁:
void print_block(int n) {mtx.lock();
for (int i = 0; i std::cout mtx.unlock();
}
这种方式容易出错,比如忘记 unlock() 或者在 unlock 前抛出异常,会导致死锁。
立即学习“C++免费学习笔记(深入)”;
3. 推荐:使用 std::lock_guard 自动管理锁
std::lock_guard 是RAII风格的锁管理类,构造时加锁,析构时自动解锁,更安全:
void print_block(int n) {std::lock_guard<:mutex> guard(mtx);
for (int i = 0; i std::cout // 离开作用域时自动释放锁 }
即使函数中途抛出异常,lock_guard 也能保证锁被正确释放。
4. 实际多线程示例
下面是一个两个线程共享输出的例子:
#includevoid worker(int id, int count) {
std::lock_guard<:mutex> guard(mtx);
std::cout }
int main() {
std::thread t1(worker, 1, 5);
std::thread t2(worker, 2, 3);
t1.join();
t2.join();
return 0;
}
每次只有一个线程能进入临界区,避免输出混乱。
基本上就这些。用 std::lock_guard 配合 std::mutex 是最常见也最安全的做法。不复杂但容易忽略细节,比如锁的粒度和作用域。锁住的时间越短越好,避免影响性能。











