• 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

std::lock_guard 是 C++11 引入的一个 RAII(Resource Acquisition Is Initialization)风格的锁管理类,用于自动管理互斥锁(mutex)的加锁和解锁,确保在任何情况下(包括异常)都能正确释放锁。

核心作用

  • 构造时加锁
  • 析构时自动解锁
  • 防止死锁和资源泄漏
  • 异常安全

✅ 它是最简单、最安全的互斥锁管理方式,适用于大多数临界区保护场景。

头文件

#include <mutex>

基本语法

std::lock_guard<std::mutex> lock(mutex_object);
  • std::mutex:可以是任何标准互斥类型(如 std::mutex, std::recursive_mutex)
  • lock:作用域内的锁对象,名字可自定义
  • mutex_object:已经定义的互斥量

使用示例

示例 1:保护共享变量

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
using namespace std;int counter = 0;
std::mutex mtx;  // 全局互斥锁void safe_increment(int n) {for (int i = 0; i < n; ++i) {// { 作用域开始std::lock_guard<std::mutex> lock(mtx);  // 构造时加锁counter++;  // 安全访问共享资源// } 作用域结束,lock 析构,自动解锁}
}int main() {vector<thread> threads;// 创建 4 个线程for (int i = 0; i < 4; ++i) {threads.emplace_back(safe_increment, 10000);}// 等待所有线程完成for (auto& t : threads) {t.join();}cout << "Final counter value: " << counter << endl;  // 应为 40000return 0;
}

构造函数

构造函数说明
explicit lock_guard(mutex_type& m);加锁并管理 m
lock_guard(mutex_type& m, std::defer_lock_t);不加锁,仅管理(但 lock_guard 不支持 defer_lock)❌
lock_guard(mutex_type& m, std::adopt_lock_t);假设锁已由当前线程持有,仅接管
⚠️ 注意:std::lock_guard 不支持 std::defer_lock,它总是立即加锁。如果需要延迟加锁,请使用 std::unique_lock。

与 std::unique_lock 的对比

特性std::lock_guardstd::unique_lock
是否立即加锁可延迟(defer_lock)
是否可手动解锁是(unlock())
是否支持条件变量
灵活性低(简单场景)高(复杂场景)
性能更高(轻量)稍低(有状态)
推荐场景普通临界区保护条件变量、复杂锁逻辑

优点总结

✅ 异常安全:即使临界区抛出异常,锁也会被释放
✅ 自动管理:无需手动调用 unlock()
✅ 代码简洁:避免忘记解锁
✅ 性能高:无额外开销

适用场景限制

❌ 不能用于需要尝试加锁(try_lock)的场景
❌ 不能用于需要条件变量(std::condition_variable)的场景
❌ 不能用于需要递归加锁的场景(除非使用 std::recursive_mutex)

总结

std::lock_guard 是 C++ 中最简单、最安全的互斥锁管理方式,应作为首选工具用于保护临界区。只要你的场景是“进入作用域加锁,离开作用域解锁”,就使用 std::lock_guard。

💡 记住一句话:“加锁后立即创建 lock_guard,让它帮你管理锁的生命周期。”

如果你需要更复杂的锁控制(如等待条件、手动解锁),再考虑使用 std::unique_lock。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96899.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96899.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96899.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI算力提升7.5倍!英伟达发布新一代机器人超级计算机Jetson Thor,驱动物理AI革命

今天&#xff0c;NVIDIA 宣布其专为物理 AI 和机器人打造的新一代机器人计算机 Jetson Thor 正式发售。其中&#xff0c;Jetson AGX Thor 开发者套件售价为 3499 美元&#xff08;约合人民币 2.5 万元&#xff09;。NVIDIA 创始人兼首席执行官黄仁勋表示&#xff1a;“Jetson T…

【数学建模】如何总结数学建模中的层次分析法最好

模型简介模型名称&#xff1a;层次分析法核心问题类型&#xff1a;评价类核心思想和适用场景 核心思想&#xff1a;将大决策问题拆解成小比较问题&#xff0c;通过数学计算综合最终结论&#xff1a;本质是人的主观判断转换为客观数据的工具[[适用场景]] 个人决策企业 / 项目决策…

`mmap` 系统调用详解

mmap 是 Unix/Linux 系统中一个强大且多用途的系统调用&#xff0c;用于将文件或设备映射到进程的地址空间&#xff0c;实现内存映射I/O。 1. 函数的概念与用途 mmap&#xff08;内存映射&#xff09;函数允许程序将文件或其他对象直接映射到其地址空间&#xff0c;这样文件内容…

深度剖析Spring AI源码(二):Model抽象层 - “驯服”天下AI的“紧箍咒”

深度剖析Spring AI源码&#xff08;二&#xff09;&#xff1a;Model抽象层 - “驯服”天下AI的“紧箍咒”上一章我们鸟瞰了Spring AI的宏伟蓝图&#xff0c;今天&#xff0c;我们要深入这座大厦的基石——Model抽象层。如果说Spring AI是连接Java与AI世界的桥梁&#xff0c;那…

永磁同步电机无速度算法--高频脉振正弦波注入到两相静止坐标系

一、原理介绍采用一种改进的永磁同步电机低速无位置传感器控制策略。与传统的旋转高频信号注入法和脉振高频信号注入法不同&#xff0c;该策略选择向静止坐标轴系注入高频脉振信号&#xff0c;转子位置估计信息可以通过载波电流响应提取。并使用一种类似于简化型扩展卡尔曼滤波…

嵌入式学习日志————ADC模数转换器之实验

1.配置ADC的步骤①开启RCC时钟&#xff0c;包括ADC和GPIO的时钟②配置GPIO&#xff0c;把相应端口配置成模拟输入模式③配置多路开关&#xff0c;把左边的通道接入右边的规则组列表里④配置ADC转换器⑤调用ADC_Cmd函数&#xff0c;开启ADC2.库函数配置ADCCLK分频器void RCC_ADC…

Java设计模式之《状态模式》

目录 1、状态模式 1.1、介绍 1.2、设计背景 1.3、适用场景 2、实现 2.1、if-else实现 2.2、状态模式实现 2.3、最终版 1、关于if-else的优化 2、状态模式下的优化 3、ArrayList 配置“状态流” 3、总结 前言 关于Java的设计模式分类如下&#xff1a; 对于状态模式…

three.js+WebGL踩坑经验合集(9.2):polygonOffsetFactor工作原理大揭秘

本篇延续上篇内容&#xff1a; three.jsWebGL踩坑经验合集(9.1):polygonOffsetUnits工作原理大揭秘-CSDN博客 跟polygonOffsetUnits相比&#xff0c;polygonOffsetFactor的系数m要复杂得多&#xff0c;因为它跟平面的视角相关&#xff0c;而不像r那样&#xff0c;在一个固定的…

C++高级特性与设计模式答案

目录 C++高级特性与设计模式:从资源管理到架构设计 一、C++高级特性:超越基础语法的利器 1. 什么是RAII(资源获取即初始化)?它有什么作用? 实现原理 核心作用 2. 什么是Pimpl惯用法?它有什么优势? 实现方式 核心优势 3. 什么是CRTP(奇异递归模板模式)?它的应用场景是…

论文阅读:arxiv 2025 Can You Trick the Grader? Adversarial Persuasion of LLM Judges

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Can You Trick the Grader? Adversarial Persuasion of LLM Judges https://arxiv.org/pdf/2508.07805 https://www.doubao.com/chat/17534937260220418 文章目录论文翻译…

6pen Art

本文转载自&#xff1a;6pen Art - Hello123工具导航 ** 一、&#x1f3a8; 6pen 是什么&#xff1f; 6pen 是一款由国内团队开发的 AI 绘画工具&#xff0c;让你只需用文字描述想法&#xff0c;就能瞬间生成惊艳的视觉画作。不管是写实风景还是抽象概念&#xff0c;它都能理…

Let‘s Encrypt证书在 Android5.x 的设备上报错

报错信息&#xff1a; com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.at com.android.volley.toolbox.NetworkUtility.shouldRetryException(N…

C语言数组名与sizeof的深层关联

要理解 “数组名本质代表整个数组的类型和内存块” 与 “sizeof(arr) 输出总字节数” 的关联&#xff0c;核心是抓住 sizeof 运算符的设计逻辑 和 数组类型的本质属性—— 这两者是直接挂钩的&#xff0c;我们一步步拆解&#xff1a;第一步&#xff1a;先明确 sizeof 的核心作用…

最近对javashop做了压力测试:百万级并发下完全不是问题

最近对 javashop 做了压力测试&#xff1a;百万级并发下完全不是问题 在电商行业竞争白热化的今天&#xff0c;系统性能直接决定了用户体验和企业商业成功。本文基于《Javashop 压测报告》&#xff0c;从技术架构、核心指标、业务价值三大维度深度解析其性能优势&#xff0c;并…

Java大厂面试实战:从Spring Boot到微服务架构的全链路技术解析

Java大厂面试实战&#xff1a;从Spring Boot到微服务架构的全链路技术解析 面试场景&#xff1a;某互联网大厂Java后端开发岗 面试官&#xff08;严肃&#xff09;&#xff1a;谢飞机&#xff0c;我们今天来聊点硬核的。先说说你对Java生态的理解。 谢飞机&#xff08;挠头&…

在分布式环境下正确使用MyBatis二级缓存

在分布式环境下使用 MyBatis 二级缓存&#xff0c;核心挑战是解决多节点缓存一致性问题。单机环境中&#xff0c;二级缓存是内存级别的本地缓存&#xff0c;而分布式环境下多节点独立部署&#xff0c;本地缓存无法跨节点共享&#xff0c;易导致 “缓存孤岛” 和数据不一致。本文…

血缘元数据采集开放标准:OpenLineage Integrations Apache Spark Quickstart with Jupyter

OpenLineage 是一个用于元数据和血缘采集的开放标准&#xff0c;专为在作业运行时动态采集数据而设计。它通过统一的命名策略定义了由作业&#xff08;Job&#xff09;、运行实例&#xff08;Run&#xff09;和数据集&#xff08;Dataset&#xff09; 组成的通用模型&#xff0…

人工智能之数学基础:离散随机变量和连续随机变量

本文重点 随机变量是概率论与统计学中的核心概念,用于将随机现象的抽象结果转化为可量化的数值。根据取值特性的不同,随机变量可分为离散型和连续型两大类。 在前面的课程中我们学习了随机变量,随机变量可以理解为一个函数,通过这个函数我们就可以将随机试验中的结果数值…

SQL语句(查询)

单表查询 常量查询 让我们来看一个具体的 SQL 代码和结果示例&#xff0c;假设有一张名为 orders 的数据表&#xff0c;它存储了订单信息&#xff0c;包括订单编号&#xff08;order_id&#xff09;、商品单价&#xff08;unit_price&#xff09;、购买数量&#xff08;quantit…

Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用

Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用引言&#xff1a;正文&#xff1a;一、Java 构建的金融数据处理架构1.1 多源数据实时融合与清洗1.2 跨市场数据关联&#xff08;风险传导分析&#xff09;二、Java 驱动的市场波动预测模型…