std::scoped_lock 是 C++17 引入的 RAII 工具,用于安全、异常安全地同时锁定多个互斥体并自动释放,内置死锁避免机制,无需手动排序,支持混合互斥体类型且仅可移动。

std::scoped_lock 是 C++17 引入的一个 RAII(资源获取即初始化)风格的工具,用于**安全、异常安全地同时锁定多个互斥体(mutexes)**,并保证在作用域结束时自动释放所有已持有的锁。它比传统的 std::lock_guard 更进一步——后者只能管理单个互斥体,而 scoped_lock 天然支持多个,且内部自动调用 std::lock 算法避免死锁。
手动按顺序加多个锁容易出错:如果两个线程以不同顺序锁定同一组 mutex(比如线程 A 先锁 m1 再锁 m2,线程 B 先锁 m2 再锁 m1),就可能触发死锁。而 scoped_lock 在构造时使用“死锁避免算法”(如尝试-回退或固定偏序),确保多个 mutex 被以一致、无冲突的顺序锁定,无需程序员自己排序或加额外同步逻辑。
只需把要锁的互斥体(支持 lock()、unlock()、try_lock() 的类型,如 std::mutex、std::recursive_mutex 等)作为参数传给 scoped_lock 构造函数:
// 示例:保护两个共享数据结构
std::mutex mtx_a, mtx_b;
int data_a = 0, data_b = 0;
{
std::scoped_lock lock(mtx_a, mtx_b); // 同时锁定,无死锁风险
data_a++;
data_b += 2;
} // 自动解锁 mtx_a 和 mtx_b
scoped_lock 内部会重排加锁顺序std::mutex、std::shared_mutex(C++17 起)、自定义符合 Lockable 概念的类型– std::lock_guard:只支持单个 mutex,不支持多锁,也不支持延迟锁定或手动解锁;
– std::unique_lock:支持单个 mutex 的延迟锁定、条件变量、手动解锁等高级操作,但多锁需配合 std::lock + 手动管理,易出错;
– std::scoped_lock:专为「多 mutex 一次性安全加锁」设计,简洁、安全、零开销抽象,是 C++17 及以后的推荐方式。
以上就是c++++的std::scoped_lock是什么 一次性锁住多个互斥体的安全方法【详解】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号