C++并发之锁(std::lock_guard,std::unique_lock)
目录
- 1 概述
- 2 使用实例
- 3 接口使用
- 3.1 lock_guard
- 3.2 adopt_lock
- 3.3 defer_lock
- 3.4 try_to_lock
- 3.5 try_lock
- 3.6 release
- 3.7 lock
- 3.8 call_one
1 概述
锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。
在构造时,互斥对象被调用线程锁定,在析构时,互斥被解锁。它是最简单的锁,作为一个具有自动持续时间的对象特别有用,该对象会持续到其上下文结束。通过这种方式,它可以保证互斥对象在抛出异常时正确解锁。
但请注意,lock_guard对象不会以任何方式管理互斥对象的生存期:互斥对象的持续时间应至少延长到锁定它的lock_guad被析构为止。
唯一锁是一个在锁定和未锁定两种状态下管理具有唯一所有权的互斥对象的对象。
在构造时(或通过对其进行移动赋值),对象获取一个互斥对象,由其锁定和解锁操作负责。
对象支持两种状态:锁定和解锁。
这个类保证销毁时的解锁状态(即使没有显式调用)。因此,作为一个具有自动持续时间的对象,它特别有用,因为它可以确保互斥对象在抛出异常时正确解锁。
不过,请注意,unique_lock对象不会以任何方式管理互斥对象的生存期:互斥对象的持续时间应至少延长到管理它的unique_lock析构为止。
其类图如下:

2 使用实例
struct Function4Lock
{int counter = 0;void print_even(int x){if( x % 2 == 0)std::cerr << x << " is event\n";elsethrow (std::logic_error("not even"));}void print_no_use_lock(std::mutex & mutex, int x){try{mutex.lock();print_even(x);counter++;mutex.unlock();}catch(const std::logic_error& e){mutex.unlock();std::cerr << e.what() << '\n';}}void print_use_lock_guard(std::mutex & mutex, int x){try{std::lock_guard<std::mutex> lock(mutex);print_even(x);counter++;}catch(const std::logic_error& e){std::cerr << e.what() << '\n';}}void print_use_unique_lock(std::mutex & mutex, int x){try{std::unique_lock<std::mutex> lock(mutex);print_even(x);counter++;}catch(const std::logic_error& e){std::cerr << e.what() << '\n';}}
};void LocksSuite::lock_guard()
{std::thread threads[10];Function4Lock function;std::mutex mutex;function.counter = 0;for(int i = 0; i < 10; i++)threads[i] = std::thread(&Function4Lock::print_no_use_lock, std::ref(function), std::ref(mutex), i + 1);for(auto & thread: threads)thread.join();TEST_ASSERT_EQUALS(true, function.counter == 5)function.counter = 0;for(int i = 0; i < 10; i++)threads[i] = std::thread(&Function4Lock::print_use_lock_guard, std::ref(function), std::ref(mutex), i + 1);for(auto & thread: threads)thread.join();TEST_ASSERT_EQUALS(true, function.counter == 5)function.counter = 0;for(int i = 0; i < 10; i++)threads[i] = std::thread(&Function4Lock::print_use_unique_lock, std::ref(function), std::ref(mutex), i + 1);for(auto & thread: threads)thread.join();TEST_ASSERT_EQUALS(true, function.counter == 5)
}
说明:
- print_no_use_lock不使用锁管理互斥对象,代码复杂不少,如果程序有多种异常及多个分支代码会更复杂。
- print_use_lock_guard 使用std::lock_guard管理互斥对象,代码简洁很多,在异常情况下和多分支情况下,std::lock_guard的析构函数会自动释放锁。
- print_use_unique_lock 使用std::unique_lock(不带参数构造)管理互斥对象, 功能与std::lock_guard相同。
std::unique_lock可以构造4种类型锁:
- normal 构造函数中调用lock加锁,析构函数调用unlock解锁
- try_to_lock 构造函数中调用try_lock加锁,通过函数owns_lock判断释放锁定,析构函数如果锁定调用unlock解锁
- defer_lock 在构造函数中不锁定,通过调用lock/try_lock/try_lock_for/try_lock_unti来加锁,析构函数如果锁定调用unlock解锁。
- adopt_lock 在构造函数中不锁定, 假设在构造之前mutex已加锁,析构函数调用unlock解锁
3 接口使用
3.1 lock_guard
void LocksSuite::lock_guard()
{std::thread threads[10];Function4Lock function;std::mutex mutex;function.counter = 0;for(int i = 0; i < 10; i++)threads[i] = std::thread(&Function4Lock::print_no_use_lock, std::ref(function), std::ref相关文章:
C++并发之锁(std::lock_guard,std::unique_lock)
目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。 在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…...
FreeRTOS队列(queue)
队列(queue)可以用于"任务到任务"、 "任务到中断"、 "中断到任务"直接传输信息。 1、队列的特性 1、1常规操作 队列的简化操如下图所示,从此图可知: 队列中可以包含若干数据:队列中有若干项,这…...
Azure数据分析Power BI
Azure数据分析Power BI 一、Power BI简介二、Power BI 如何匹配角色三、Power BI 构建基块四、使用 Power BI 服务一、Power BI简介 Microsoft Power BI 是一系列的软件服务、应用和连接器,这些软件服务、应用和连接器协同工作,将不相关的数据源转化为合乎逻辑、视觉上逼真的…...
将 Python3 程序打包成 APK 并运行在 ARM 的 Android 系统中
作为一个开发者,我们经常需要将我们的 Python 程序部署到移动端,以便更好地服务于用户。然而,直接在 Android 系统上运行 Python 程序却存在一定的挑战,因为 Android 系统默认不支持 Python。这篇文章将介绍如何将 Python3 程序打…...
学习记录:VS2019+OpenCV3.4.1实现SURF库函数的调用
最近在学习opencv的使用,在参照书籍《OpenCV3编程入门》实现SURF时遇到不少问题,下面做归纳总结。 错误 LNK2019 无法解析的外部符号 “public: static struct cv::Ptr __cdecl cv::xfeatures2d::SURF::create(double,int,int,bool,bool)” (?createSUR…...
JVM-基础知识
JVM-基础知识 什么是JVM JVM是一种跨语言的平台,任何语言只要能编译成.class文件都可以被JVM运行。JVM只和.class文件有关系,和Java语言没关系。JVM是一种虚拟机规范。 java文件是如何交给JVM执行的 JVM的常见实现 HostStop:Oracle官方另外还有IBM的J9、…...
保密工作应党而生、伴党而行、为党而兴
1.(C )工作应党而生、伴党而行、为党而兴,始终是党和国家的一项重要工作。 A. 农业 B. 国防 C. 保密 D. 文化 2.机关、单位对所产生的国家秘密事项,应当按照国家秘密及其密级的具体范围的规定确定密级,同时确定&#x…...
docker login 报错: http: server gave HTTP response to HTTPS client
环境: 自建 Harbor、Docker 1. 问题分析 # 命令,这里用的是 IP,可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下: Error response from daemon: Get "https://172.16.51.182:31120/…...
「C系列」C 文件读写
文章目录 一、C 文件读写1. 打开文件2. 写入文件3. 读取文件4. 关闭文件5. 文件读写模式6. 错误处理 二、常见问题1. 文件打开失败2. 文件读写错误3. 文件读写位置4. 缓冲区刷新 三、相关链接 一、C 文件读写 在C语言中,文件读写是通过一系列的标准库函数来完成的&…...
编程中的cos:深度解析与应用探索
编程中的cos:深度解析与应用探索 在编程的广阔天地中,cos这一数学概念扮演着举足轻重的角色。它不仅是数学函数库中的基础元素,更是图形渲染、科学计算以及数据处理等多个领域的核心工具。本文将从四个方面、五个方面、六个方面和七个方面&a…...
计算机毕业设计hadoop+spark+hive知识图谱酒店推荐系统 酒店数据分析可视化大屏 酒店爬虫 高德地图API 酒店预测系统 大数据毕业设计
流程: 1.Python爬取去哪儿网全站旅游数据约10万,存入mysql; 2.使用pandasnumpy/hadoopmapreduce对mysql中旅游数据进行数据清洗,使用高德API计算地理信息,最终转为.csv文件上传hdfs; 3.hive建库建表导入.csv文件作为数据集&#x…...
简单谈谈云服务器私网IP的存在意义及优势
云服务器是基于虚拟化技术的计算资源,可以在云平台上灵活创建和管理。为了满足不同用户的需求,云服务提供商在云服务器上分配了两种类型的IP地址:公网IP和私网IP。其中,私网IP是指在局域网内使用的内部IP地址,无法通过…...
python错题(2)
、...
禁止methtype联网
mathtype断网_如何禁止mathtype联网-CSDN博客https://blog.csdn.net/qq_41060221/article/details/128144783...
【iOS】UI学习——cell的复用及自定义cell
目录 前言cell的复用手动(非注册)自动(注册) 自定义cell总结 前言 Cell复用和自定义Cell是在开发iOS应用时常见的一种优化技巧和定制需求。 Cell复用是UITableView或UICollectionView的一个重要优化机制。当用户滚动这些视图时…...
【详细介绍下PostgreSQL】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
基于Matlab停车场车牌识别计时计费管理系统 【W2】
简介 停车场车牌识别计时计费管理系统在现代城市管理中具有重要意义。随着城市化进程的加快和车辆数量的增加,传统的人工管理停车场的方式已经难以满足效率和精确度的要求。因此引入车牌识别技术的自动化管理系统成为一种趋势和解决方案。 背景意义 提升管理效率&a…...
码住!详解时序数据库不同分类与性能对比
加速发展中的时序数据库,基于不同架构,最流行的类别是? 作为管理工业场景时序数据的新兴数据库品类,时序数据库凭借着对海量时序数据的高效存储、高可扩展性、时序分析计算等特性,一跃成为物联网时代工业领域颇受欢迎的…...
【C/C++】实参与形参的区别
在编程中,形参(形式参数)和实参(实际参数)是函数调用中的两个基本概念,它们在函数定义和函数调用中扮演着不同的角色。 形参(Formal Parameters): 形参是在函数定义时声明…...
---异常---
我们在运行程序时总遇到各种与报错,数组越界,空指针的引用,这些在java中都称为异常 对于不同的错误都具有一个与他对应的异常类来秒描述 这是对于数组越界这个类里有的方法,这些是描述异常的 在java中有一个完整的描述异常的类的…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
