当前位置: 首页 > news >正文

【C++】lock_guard 与 unique_lock

目录

一、lock_guard 与 unique_lock 介绍

1. lock_guard:简单安全

2. unique_lock:灵活

3.两种锁包装器的对比

二、使用示例

1. lock_guard 基本用法

2. unique_lock 灵活用法(延迟加锁 + 手动解锁)

3. unique_lock 与条件变量配合

三、总结


一、lock_guardunique_lock介绍

两者都是 C++11 起提供的RAII 风格锁包装器,用于自动管理mutex的加锁 / 解锁,避免因异常或提前返回导致的死锁。

1.lock_guard:简单安全
  • 核心特点:构造时自动加锁,析构时自动解锁,不支持手动加锁 / 解锁,也不可移动或拷贝。
  • 适用场景:仅需简单保护临界区,无需灵活控制锁的时机。
  • 构造选项
    • 直接传入mutex:立即加锁。
    • 配合std::adopt_lock:接管已加锁的mutex(不重复加锁)。
2.unique_lock:灵活
  • 核心特点:支持手动加锁 / 解锁延迟加锁移动语义(不可拷贝),可与条件变量配合使用。
  • 适用场景:需要灵活控制锁的生命周期(如提前解锁、延迟加锁),或与std::condition_variable配合。
  • 构造选项
    • std::defer_lock:延迟加锁,构造时不加锁,后续需手动调用lock()
    • std::try_to_lock:尝试加锁,不阻塞,通过owns_lock()判断是否成功。
    • std::adopt_lock:接管已加锁的mutex
3.两种锁包装器的对比
特性lock_guardunique_lock
灵活性低(仅自动加锁 / 解锁)高(支持手动控制、移动等)
性能开销略小(无额外状态管理)略大(需维护锁状态)
与条件变量配合不支持支持(condition_variable::wait必须用)
适用场景简单临界区保护复杂场景(延迟加锁、条件变量等)

二、使用示例

1.lock_guard基本用法
#include <mutex> #include <iostream> std::mutex mtx; int shared_data = 0; void increment() { std::lock_guard<std::mutex> guard(mtx); // 自动加锁 ++shared_data; // 离开作用域,guard 析构自动解锁 }
2.unique_lock灵活用法(延迟加锁 + 手动解锁)
#include <mutex> std::mutex mtx; void flexible_lock() { std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 暂不加锁 // ... 做一些不需要锁的操作 ... lock.lock(); // 手动加锁 // ... 临界区操作 ... lock.unlock(); // 提前解锁(可选) // ... 后续操作 ... } // 若仍持有锁,析构时会自动解锁
3.unique_lock与条件变量配合
#include <mutex> #include <condition_variable> #include <queue> std::mutex mtx; std::condition_variable cv; std::queue<int> data_queue; void consumer() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, []{ return !data_queue.empty(); }); // 自动解锁+等待,满足条件后重新加锁 int data = data_queue.front(); data_queue.pop(); }

三、总结

  • 优先用lock_guard:简单高效,满足基本临界区保护需求。
  • 需灵活控制或条件变量时用unique_lock:适配复杂场景。

感谢阅读,本文如有错漏之处,烦请斧正。

http://www.jsqmd.com/news/471585/

相关文章:

  • 别再用串口屏蹲车间了!WPF .NET 8上位机实战:自定义仪表盘+LiveCharts2趋势图+SignalR远程运维,附6个工业级踩坑指南
  • 支付宝立减金回收黑科技!不用消费也能把钱揣进口袋 - 可可收
  • 基于ATP仿真建模的35kV与110kV变压器PT谐振过电压问题研究
  • PHP的多个账号使用同一手机号,收货地址怎么同步?
  • LabVIEW打造超酷液压泵试验台程序:功能全解析
  • 分析2026年江苏口碑不错的液氧、高纯氮、标准气工业气体厂家 - 工业品网
  • 做了8年工业上位机,我开源了这套通用框架!多设备/多协议10分钟快速对接,开箱可商用
  • 电网同步这事儿听着玄乎,其实就像给三相交流电装个节拍器。传统锁相环遇到电压波动就哆嗦,今天咱们聊点硬核的——怎么用d轴电压归一化让这个节拍器稳如老狗
  • 拒绝“实景贴皮感”:2D 角色摄影级实景融合与动态投射工作流
  • 用COMSOL拆解变电站的电场分布:从高压柜到电缆的实战指南
  • 西门子S7 - 1500博图程序在大型生产线中的实战例程分享
  • 北京/上海/深圳/杭州/南京/无锡高端腕表维修科普:品牌故障解析+正规门店指引 - 时光修表匠
  • 光伏储能微电网系统设计与实现
  • 【LLM进阶-RAG】2.切片算法策略
  • 分析初中毕业选学校服务,合肥南亚理工学校性价比高吗 - mypinpai
  • Cursor 自己写 Skill 完整教程
  • 毛囊干细胞源头厂家怎么选择,颐美康值得考虑吗? - 工业推荐榜
  • 汇川ISP500伺服控制器方案解析:从代码到实际应用
  • 篡改人才评估模型的技术漏洞与防御体系——软件测试工程师的伦理使命
  • 虹关、察关、凤山:一条古道串起的徽州春色
  • 分析2026年哈尔滨初高中文化课培训学校,哪家口碑更好 - mypinpai
  • 光伏硅片尺寸测量:Java+YOLO+OpenCV亚像素级检测,精度达0.01mm
  • 最近在研究CST仿真超表面,特别是聚焦和聚焦涡旋的效果,感觉挺有意思的。今天就来分享一下全流程的教学,顺便穿插一些代码和代码分析,希望能帮到有需要的朋友
  • 锅炉控制器项目揭秘:企业级实战经验大分享
  • 仙螺岛:南戴河海上秘境,千米索道赴山海之约
  • Compose 基础 - 重组优化
  • 基于麻雀算法深度优化极限学习机的故障诊断方法(SSA-DELM)
  • 2026年南昌口碑好的养老服务中心盘点,赣洪仁心医养值得关注 - 工业推荐榜
  • Redis的常用功能
  • 响应“双碳”战略:2026西北五大合规再生资源回收服务商榜单发布 - 深度智识库