讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

C++ std::scoped_lock用法 _ C++17多重锁RAII包装器【详解】

陌涛大大_6019

陌涛大大_6019

发布时间:2026-04-12 19:16:34

|

770人浏览过

|

来源于php中文网

原创

std::scoped_lock是C++17起唯一推荐的多互斥量RAII锁工具,要求所有参数为非const左值引用,不支持临时对象、const引用、重复锁同一互斥量、超时或手动解锁,仅适用于简单短时加锁场景。

c++ std::scoped_lock用法 _ c++17多重锁raii包装器【详解】

std::scoped_lock 是 C++17 起唯一推荐的、能安全同时锁定多个互斥量的 RAII 方式;它不是 lock_guard 的多参数升级版,而是专为“多锁 + 零死锁 + 强异常安全”设计的独立工具。

构造时传参必须是左值引用,不能是临时对象或 const 引用

编译失败是最常见的第一道门槛。std::scoped_lock 构造函数要求所有参数都是非 const 的左值引用(即变量名本身),因为内部要调用 std::lock,而 std::lock 只接受可修改的 Lockable&。

  • ✅ 正确:std::scoped_lock lock(mtx1, mtx2);(mtx1、mtx2 是已定义的 std::mutex 变量)
  • ❌ 错误:std::scoped_lock lock(std::mutex{}, mtx2);(临时 std::mutex{} 无法绑定非 const 左值引用)
  • ❌ 错误:std::scoped_lock lock(const_cast<const std::mutex>(mtx1), mtx2);</const>(const 引用不满足 Lockable 概念)
  • ⚠️ 注意:即使你只传一个互斥量,比如 std::scoped_lock lock(mtx);,语法合法,但它仍强制要求该参数是左值 —— 这和 std::lock_guard 的语义已不同,别误以为是兼容写法

重复传入同一互斥量会导致未定义行为

语法上允许 std::scoped_lock lock(mtx, mtx);,但运行时极可能卡死或抛 std::system_error。这不是编译期检查项,而是逻辑错误。

  • 它不会帮你去重,也不会报错提示;std::lock 内部对同一对象多次加锁的行为是未定义的
  • 如果你发现需要“锁同一个 mutex 多次”,说明临界区划分或数据结构设计有问题 —— 应检查是否真需多把锁,或改用 std::recursive_mutex(但通常更建议重构)
  • 调试时若线程突然 hang 住,且堆栈停在 std::scoped_lock 构造函数内,优先排查参数是否重复

混合类型互斥量可以共存,但必须都满足 Lockable 概念

std::scoped_lock 支持同时锁定 std::mutex、std::shared_mutex、std::recursive_mutex,甚至自定义类型,只要它们提供 lock()、unlock()、try_lock() 成员函数。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

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

  • ✅ 合法:std::scoped_lock lock(mtx, sh_mtx);(mtx 是 std::mutex,sh_mtx 是 std::shared_mutex)
  • ❌ 非法:传入 std::unique_lock<:mutex></:mutex> 或其它锁管理器对象 —— 它只接受原始互斥量实例,不接受“已封装的锁”
  • ⚠️ 注意:std::shared_mutex 的 lock() 是排他写锁,不是共享读锁;想用共享模式得换 std::shared_lock,但那不属于 scoped_lock 的职责范围

没有延迟锁定能力,也不支持手动解锁或超时

std::scoped_lock 的设计哲学是「构造即抢锁,析构即释放」,它不提供任何中间状态控制接口。

  • ❌ 不支持 try_lock_for、try_lock_until —— 若需超时,必须换用 std::unique_lock
  • ❌ 不支持 unlock() 或提前释放某一把锁 —— 所有锁生命周期完全绑定到作用域
  • ❌ 不支持 std::defer_lock 等策略标签 —— 它只有两种构造方式:scoped_lock(mtx...) 和 scoped_lock(std::adopt_lock, mtx...)(后者仅用于接管已由 std::lock 成功获取的锁)
  • ? 场景判断:如果临界区逻辑复杂、需条件等待、或锁持有时间不可控,scoped_lock 就不是合适选择 —— 它只适合“简单、短时、确定性加锁”的场景

最易被忽略的是它的“单向性”:它不关心你传参顺序,但极度依赖互斥量对象本身的生命周期 —— 若某个 std::mutex 在 scoped_lock 作用域内被 move 走或析构,行为未定义。确保所有传入的互斥量在整个锁持有期间都有效且未被转移。

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2478

2023.09.20

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2941

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

416

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

512

2026.05.09

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5529

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn