C++如何使用std::scoped_lock管理多个互斥锁?(C++17)

admin 百科 13
std::scoped_lock是C++17引入的RAII锁管理工具,自动按地址顺序加锁以避免死锁,支持任意数量兼容BasicLockable的互斥量,构造即全锁、析构即全解锁,简洁安全且强异常安全。

C++如何使用std::scoped_lock管理多个互斥锁?(C++17)-第1张图片-佛山资讯网

std::scoped_lock 是 C++17 引入的轻量级 RAII 工具,用于安全、自动地管理一个或多个互斥锁(如 std::mutex、std::recursive_mutex 等),它能避免死锁并简化代码。

自动规避死锁:按地址顺序加锁

当传入多个互斥量时,std::scoped_lock 会内部按对象地址升序排序,然后依次调用 lock() —— 这保证了所有线程以相同顺序获取锁,从根本上防止因加锁顺序不一致导致的死锁。

你不需要手动排序或关心锁的顺序,只要把它们一起传进去即可:

std::mutex m1, m2, m3;
// 安全:内部自动按地址顺序加锁
std::scoped_lock lock(m1, m2, m3); // ✅ 不会死锁

登录后复制

支持任意数量和类型的兼容互斥量

只要类型满足 BasicLockable 要求(即提供 lock()/unlock()/try_lock()),就可混用。例如:

立即学习“C++免费学习笔记(深入)”;

  • 多个 std::mutex
  • std::mutex + std::recursive_mutex
  • std::timed_mutex(但注意:若含 timed_mutex,所有锁都需支持 try_lock_for/try_lock_until;否则编译失败)

不支持 std::shared_mutex(因其 lock() 非无异常,且接口不完全匹配 BasicLockable)。

比 std::lock + std::lock_guard 更简洁

以前常用 std::lock 配合多个 std::lock_guard,写法冗长且易出错:

标签: 工具 ai c++ 作用域 red 有锁 asic

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~