您的位置:首页 >C++互斥锁使用教程:多线程同步技巧
发布于2026-03-10 阅读(0)
扫一扫,手机访问
std::mutex必须配合RAII类(如std::lock_guard或std::unique_lock)使用,裸调lock()/unlock()易因异常、提前return等导致死锁;多锁需统一顺序或用std::scoped_lock避免AB-BA死锁;mutex不可复制移动,应为private成员并禁用拷贝;递归需求才用std::recursive_mutex;关键在合理界定共享数据与临界区粒度。

直接调用 mutex.lock() 和 mutex.unlock() 极易出错——忘记 unlock、提前 return、抛异常都会导致死锁。C++ 标准库不推荐裸调用,而是靠 RAII 自动管理生命周期。
实操建议:
std::lock_guard 最常用:构造即加锁,析构即解锁,不能转移,轻量且安全std::unique_lock 用于需要延迟加锁、手动解锁、或配合条件变量的场景std::mutex 再次调用 lock() —— 这是未定义行为,多数实现会死锁两个线程分别按不同顺序获取 mtx_a 和 mtx_b,比如线程1先锁 a 再锁 b,线程2先锁 b 再锁 a,就可能互相等待对方释放——典型 AB-BA 死锁。
实操建议:
std::scoped_lock(C++17 起)一次性加多个锁,它内部自动按地址排序并避免死锁:std::scoped_lock lock(mtx_a, mtx_b);std::lock(mtx_a, mtx_b) + std::lock_guard 的组合,但更啰嗦常见错误:把 std::mutex 成员变量设为 public,然后意外被拷贝;或试图 std::vector —— 编译直接失败,因为 std::mutex 删除了拷贝和移动构造函数。
实操建议:
MyClass(const MyClass&) = delete;)std::vector> 或静态数组,而不是直接存对象有些场景确实需要同一线程多次进入临界区(比如递归函数调用),但 std::mutex 不支持。有人误以为“加锁两次就自动递归”,结果程序卡死。
实操建议:
std::recursive_mutex,并配 std::lock_guard 或 std::unique_lockstd::mutex 重真正难的不是写对 lock/unlock,而是判断哪段数据算“共享”、哪个粒度该加锁、以及锁住之后是否还调用了可能阻塞或抛异常的第三方代码——这些地方一漏,std::mutex 就成了幻觉。
上一篇:荒野行动PC版快捷键设置教程
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9