新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++ 线程互斥锁 lock_guard的基本用法

发布时间:2026/10/2 15:21:01来源:尧图网络
C++ 线程互斥锁 lock_guard的基本用法
std::lock_guard是 C11 标准库提供的RAII 风格的互斥锁封装类核心目的是自动管理互斥锁的加锁 / 解锁从根本上避免 “忘记解锁导致死锁”“异常导致锁无法释放” 这类低级且致命的错误。一、先理解核心RAII 设计思想lock_guard的底层是RAII资源获取即初始化机制 —— 简单说构造时获取资源lock_guard对象创建时自动调用互斥锁的lock()方法加锁析构时释放资源lock_guard对象销毁时比如出作用域自动调用互斥锁的unlock()方法解锁。这种 “自动性” 是解决多线程锁管理问题的关键不用再手动记着unlock()。二、lock_guard的基本用法对比手动加解锁先看错误的手动加解锁容易出问题12345678910#include mutexstd::mutex mtx;voidwrong_func() {mtx.lock();// 手动加锁// 临界区操作修改共享资源inta 10;// 忘记解锁 → 死锁// 或如果临界区抛出异常unlock()永远执行不到 → 死锁// mtx.unlock();}再看正确的 lock_guard 用法自动解锁123456789#include mutexstd::mutex mtx;voidright_func() {// 创建lock_guard对象时自动调用mtx.lock()std::lock_guardstd::mutex lock(mtx);// 临界区安全操作共享资源inta 10;}// lock_guard对象出作用域析构时自动调用mtx.unlock()// 即使临界区抛出异常析构函数也会执行 → 必解锁三、lock_guard的核心特性1. 不可拷贝、不可移动lock_guard被设计为 “只能在当前作用域使用”禁止拷贝 / 移动避免锁的管理权被非法转移123std::lock_guardstd::mutex lock1(mtx);// std::lock_guardstd::mutex lock2 lock1; // 编译错误禁止拷贝// std::lock_guardstd::mutex lock3(std::move(lock1)); // 编译错误禁止移动2. 作用域决定解锁时机lock_guard的解锁时机完全由作用域控制你可以通过{}手动限定作用域精准控制解锁时机123456789voidfunc() {{std::lock_guardstd::mutex lock(mtx);// 短临界区只保护必要的代码shared_data 100;}// 此处提前解锁不影响后续非临界区代码// 非临界区无需持锁提升并发效率sleep(1);}3. 轻量级、无额外开销lock_guard是极简封装没有额外的成员函数比如unlock()/lock()运行时几乎无性能损耗适合简单的临界区保护。4. 异常安全这是lock_guard最核心的优势之一即使临界区抛出异常C 的异常机制会保证局部对象的析构函数执行从而确保锁被释放1234567891011121314voidfunc_with_exception() {std::lock_guardstd::mutex lock(mtx);// 临界区抛出异常throwstd::runtime_error(出错了);// 无需手动unlock析构函数会处理}intmain() {try{func_with_exception();}catch(...) {// 捕获异常后锁已经被释放其他线程可正常获取}return0;}四、lock_guardvsunique_lock选型参考lock_guard是 “轻量版” 锁管理std::unique_lock是 “功能版”两者的核心区别如下特性std::lock_guardstd::unique_lock自动加解锁✅ 支持✅ 支持手动解锁unlock()❌ 不支持✅ 支持配合条件变量cv.wait()❌ 不支持✅ 支持性能极致轻量略重有额外状态适用场景简单临界区保护复杂同步如条件变量、手动控制解锁简单说只要是 “加锁后作用域结束解锁” 的简单场景优先用lock_guard轻量、高效如果需要手动解锁、配合条件变量比如cv.wait()需要解锁后阻塞用unique_lock。五、完整示例lock_guard 保护共享资源1234567891011121314151617181920212223242526272829#include iostream#include thread#include mutex#include vectorstd::mutex mtx;intshared_count 0;// 共享资源// 线程函数累加共享变量voidincrement(intn) {for(inti 0; i n; i) {// lock_guard自动加锁/解锁std::lock_guardstd::mutex lock(mtx);shared_count;// 出循环迭代的作用域自动解锁}}intmain() {std::vectorstd::thread threads;// 创建10个线程每个线程累加1000次for(inti 0; i 10; i) {threads.emplace_back(increment, 1000);}// 等待所有线程结束for(auto t : threads) {t.join();}// 正确输出10000无数据错乱std::cout 最终count值 shared_count std::endl;return0;}总结std::lock_guard是 C11 的 RAII 锁封装构造加锁、析构解锁核心解决 “忘记解锁 / 异常导致锁泄漏” 的问题轻量级、异常安全、不可拷贝适合简单临界区的线程安全保护解锁时机由作用域决定可通过{}手动缩小作用域提升并发效率复杂同步场景如条件变量用unique_lock简单场景优先用lock_guard。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

YOLOv8猫狗检测实战:4300张数据集训练调优与部署全解析 2026/10/2 16:07:15

YOLOv8猫狗检测实战:4300张数据集训练调优与部署全解析

1. 为什么我盯上了这个4300张的猫狗检测数据集做目标检测这行的朋友都有一个共识:模型结构可以复现,训练脚本可以照抄,唯独高质量、标注规范、场景覆盖到位的数据集,是真正卡脖子的资源。我前后经手过十几个宠物识别相关的项目&am…

阅读更多 →
Paperclip:Node.js+React+OpenClaw构建AI Agent轻量落地架构 2026/10/2 16:07:14

Paperclip:Node.js+React+OpenClaw构建AI Agent轻量落地架构

1. 项目概述:Paperclip 不是回形针,而是一个被严重误读的 AI 工程实践入口“Paperclip”这个词一出来,很多人第一反应是办公桌上那个弯弯绕绕的金属小物件——回形针。但在这个技术语境下,它根本不是物理实体,而是一个…

阅读更多 →
视觉原型驱动的小目标检测数据生成方法 2026/10/2 16:07:14

视觉原型驱动的小目标检测数据生成方法

1. 这不是又一个“数据增强”噱头,而是小目标检测领域正在发生的静默革命你有没有在做无人机航拍图像的小目标检测时,被这样的问题反复折磨过:标注一张图要花20分钟,而模型在测试集上一遇到遮挡、低分辨率、尺度突变就直接漏检&am…

阅读更多 →
AMD ROCm云实例部署Gemma4:15分钟落地实战与踩坑记录 2026/10/2 16:07:14

AMD ROCm云实例部署Gemma4:15分钟落地实战与踩坑记录

直奔主题:AMD ROCm 云实例跑 Gemma4,15 分钟到底是噱头还是真能落地? 先说结论:15 分钟这个数字,如果你指的是 从拿到一台裸的 AMD 云实例、到模型开始正常吐字 ,那是有可能做到的,但前提是你…

阅读更多 →
GPTs 提示词工程解析:「互联网+挑战杯大创竞赛导师」的五维角色配置设计 2026/10/2 16:07:14

GPTs 提示词工程解析:「互联网+挑战杯大创竞赛导师」的五维角色配置设计

提示工程 【免费下载链接】GPTs leaked prompts of GPTs 项目地址: https://gitcode.com/GitHub_Trending/gp/GPTs 点击查看 免费下载 本文以开源仓库 GitHub_Trending/gp/GPTs 中收录的泄露提示词 互联网挑战杯大创竞赛导师.md 为研究对象,逐段拆解这份…

阅读更多 →
云服务器代理商:Hermes Agent API集成指南 让 AI 助手连接你的所有业务|TaoToken 统一 Key 打通 OpenAI 与 CRM Webhook 2026/10/2 16:07:00

云服务器代理商:Hermes Agent API集成指南 让 AI 助手连接你的所有业务|TaoToken 统一 Key 打通 OpenAI 与 CRM Webhook

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉