lock_guard和unique_lock学习总结
1.std::lock_guard
std::lock_guard其实就是简单的RAII(Resource Acquisition Is Initialization)封装,资源获取即初始化。在构造函数中进行加锁,析构函数中进行解锁,这样可以保证函数退出时,锁一定被释放。
不可以对 std::lock_guard 调用 unlock 进行解锁操作。std::lock_guard 是一个非常简单的互斥量管理类,设计初衷是提供一种 RAII(资源获取即初始化)风格的锁机制,当 std::lock_guard 对象创建时锁定互斥量,并在对象销毁时析构函数里自动解锁互斥量。std::lock_guard 没有提供解锁和重新锁定的功能。它的接口非常简单,只包含构造函数和析构函数,没有 unlock 或 lock 方法。这使得 std::lock_guard 更加轻量级,但也更不灵活。
构造函数:
explicit lock_guard(mutex_type& m); // 引用类型,锁定互斥量m,析构函数中解锁// 其中mutex_type是模板参数的别名
template <class Mutex>
class lock_guard {
public:using mutex_type = Mutex; // 定义 mutex_type 为模板参数 Mutexexplicit lock_guard(mutex_type& m);~lock_guard();// ...
};
2.std::unique_lock
转自:https://www.cnblogs.com/moodlxs/p/10111843.html
std::lock_guard的功能超集, 封装了各种加锁操作,阻塞的,非阻塞的,还可以结合条件变量一起使用,基本上对锁的各种操作都封装了。所以性能和内存开销都比std::lock_guard大得多,需要有选择地使用。 std::unique_lock也会在析构的时候自动解锁,所以说,是std::lock_guard的功能超集。
支持多种加锁模式,构造函数:
unique_lock() noexcept; // 默认构造函数创建一个不与任何互斥量相关联的 unique_lock 对象
explicit unique_lock(mutex_type& m); //创建一个与互斥量 m 相关联并立即锁定它的 unique_lock 对象,通过析构函数unlock
unique_lock( mutex_type& m, std::defer_lock_t t ); //延迟加锁,之后再调用lock()主动加锁,可以不用unlock,可以通过unique_lock的析构函数unlock
unique_lock( mutex_type& m, std::try_to_lock_t t ); //尝试加锁
unique_lock( mutex_type& m, std::adopt_lock_t t ); //马上加锁
unique_lock(unique_lock&& u) noexcept; // 移动构造函数。原来的 unique_lock 对象将不再持有互斥量。
尝试加锁例子:
std::mutex mlock;void work1(int& s) {for (int i = 1; i <= 5000; i++) {std::unique_lock<std::mutex> munique(mlock, std::try_to_lock);if (munique.owns_lock() == true) {// 判断是否加锁成功s += i;}else {// 执行一些没有共享内存的代码}}
}
延迟加锁例子:
void work1(int& s) {for (int i = 1; i <= 5000; i++) {std::unique_lock<std::mutex> munique(mlock, std::defer_lock);if (munique.try_lock() == true) {// 判断当前是否能locks += i;}else {// 处理一些没有共享内存的代码}}
}
移动构造函数例子:
std::unique_lock<std::mutex> munique1(mlock);
std::unique_lock<std::mutex> munique2(std::move(munique1));
// 此时munique1失去mlock的权限,并指向空值,munique2获取mlock的权限
相关文章:
lock_guard和unique_lock学习总结
1.std::lock_guard std::lock_guard其实就是简单的RAII(Resource Acquisition Is Initialization)封装,资源获取即初始化。在构造函数中进行加锁,析构函数中进行解锁,这样可以保证函数退出时,锁一定被释放…...
数据挖掘-padans初步使用
目录标题 Jupyter Notebook安装启动 Pandas快速入门查看数据验证数据建立索引数据选取⚠️注意:排序分组聚合数据转换增加列绘图line 或 **(默认):绘制折线图。bar:绘制条形图。barh:绘制水平条形图。hist&…...
小阿轩yx-案例:项目发布基础
小阿轩yx-案例:项目发布基础 前言 随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集…...
【HarmonyOS】时间处理Dayjs
背景 在项目中经常会使用要时间的格式转换,比如数据库返回一个Date数据,你需要转成2024-10-2的格式,鸿蒙的原生SDK中是没有办法实现的,因此,在这里介绍第三方封装好并且成熟使用的库Dayjs。 安装 切换到Entry文件夹下…...
论React Native 和 UniApp 的区别
1. 开发语言与框架 React Native: 使用 JavaScript 和 React 框架进行开发。采用了 React 的组件化开发模式,适合熟悉 React 生态的开发者。使用 JavaScript 编写的代码会通过 React Native 框架桥接到原生代码(如 iOS 的 Swift 或 Android 的 Java/Kotl…...
微信小程序处理交易投诉管理,支持多小程序
大家好,我是小悟 1、问题背景 玩过微信小程序生态的,或许就有这种感受,如果收到投诉单,不会及时通知到手机端,而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…...
Pikachu-xss防范措施 - href输出 js输出
总体原则: 输入做过滤,输出做转义 过滤:根据业务需要进行过滤,如:输入点要求输入手机号,则只允许输入手机号格式的数字; 转义:所有输出到前端的数据,都根据输出点进行转…...
数据结构双向链表和循环链表
目录 一、循环链表二、双向链表三、循环双向链表 一、循环链表 循环链表就是首尾相接的的链表,就是尾节点的指针域指向头节点使整个链表形成一个循环,这就弥补了以前单链表无法在后面某个节点找到前面的节点,可以从任意一个节点找到目标节点…...
go基础面试题汇总第一弹
init函数是什么时候执行的? init的函数的作用是什么? 通常作为程序执行前包的初始化,例如mysql redis 等中间件的初始化 init函数的执行顺序是怎样的? 分不同情况来回答: 在同一个go文件里面如果有多个init方法,它们…...
Redis 实现分布式锁时需要考虑的问题
引言 分布式系统中的多个节点经常需要对共享资源进行并发访问,若没有有效的协调机制,可能会导致数据竞争、资源冲突等问题。分布式锁应运而生,它是一种保证在分布式环境中多个节点可以安全地访问共享资源的机制。而在Redis中,使用…...
百年极限论一直存在百年糊涂话:有正数小于所有正数
百年极限论一直存在百年糊涂话:有正数小于所有(任何、任意)正数。 “对于每个大于0的ε[ε>0],都有非0距离数小于ε”显然是病句:有正数小于每个(所有)正数ε。其中任意(任何&am…...
红日靶场1学习笔记
一、准备工作 1、靶场搭建 靶场地址 靶场描述 靶场拓扑图 其他相关靶场搭建详情见靶场地址相关说明 2、靶场相关主机信息 后续打靶场的过程中,如果不是短时间内完成,可能ip会有变化 主机ip密码角色win7192.168.122.131hongrisec2019!边界服务器win…...
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
文章目录 从零实现 list 容器:细粒度剖析与代码实现前言1. list 的核心数据结构1.1节点结构分析: 2. 迭代器设计与实现2.1 为什么 list 需要迭代器?2.2 实现一个简单的迭代器2.2.1 迭代器代码实现:2.2.2 解释: 2.3 测试…...
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
选择最适合你的.NET UI框架:全面解析六种热门选择 前言 在现代软件开发中,选择合适的桌面应用框架和UI库对于开发人员来说至关重要。本文将介绍几种流行的.NET桌面应用框架和UI库,包括Eto.Forms、Avalonia、ReactiveUI、MahApps.Metro、Mat…...
第二十一章 (动态内存管理)
1. 为什么要有动态内存分配 2. malloc和free 3. calloc和realloc 4. 常⻅的动态内存的错误 5. 动态内存经典笔试题分析 6. 总结C/C中程序内存区域划分 1.为什么要有动态内存管理 我们目前已经掌握的内存开辟方式有 int main() {int num 0; //开辟4个字节int arr[10] …...
机器学习框架总结
机器学习框架是用于构建、训练、评估和部署机器学习模型的工具和库的集合。它们简化了模型开发过程,并提供了预构建的功能、优化的计算性能和对深度学习、监督学习、无监督学习等技术的支持。下面是一些主要的机器学习框架的详细介绍: 1. TensorFlow 1…...
docker pull 超时的问题如何解决
docker不能使用,使用之前的阿里云镜像失败。。。 搜了各种解决方法,感谢B站UP主 <iframe src"//player.bilibili.com/player.html?isOutsidetrue&aid113173361331402&bvidBV1KstBeEEQR&cid25942297878&p1" scrolling"…...
【数学分析笔记】第4章第3节 导数四则运算和反函数求导法则(2)
4. 微分 4.3 导数四则运算与反函数求导法则 双曲正弦函数 sh x e x − e − x 2 \sh x\frac{e^x-e^{-x}}{2} shx2ex−e−x 双曲余弦函数 ch x e x e − x 2 \ch x\frac{e^xe^{-x}}{2} chx2exe−x ch 2 x − sh 2 x 1 \ch^2 x-\sh^2 x1 ch2x−sh2x1 ( e…...
【2024】基于mysqldump的数据备份与恢复
基于mysqldump备份与恢复 mysqldump是一个用于备份 MySQL 数据库的实用工具。 它可以将数据库的结构(如数据库、表、视图、存储过程等的定义)和数据(表中的记录)导出为文本文件,这些文本文件可以包含 SQL 语句&#…...
家用无线路由器配置
一.首先进行线路连接。如下图:"光猫LAN口"—网线—"路由器WAN口"。 注意:家用光纤宽带一般选择使用200兆宽带到1000兆,如果网速不达标请查看路由器是否是千兆路由器。千兆路由器通常是双频的,支持两个信号一个…...
如何快速掌握UV-UI框架:面向开发者的完整跨平台开发实战指南
如何快速掌握UV-UI框架:面向开发者的完整跨平台开发实战指南 【免费下载链接】uv-ui uv-ui 破釜沉舟之兼容vue32、app、h5、小程序等多端基于uni-app和uView2.x的生态框架,支持单独导入,开箱即用,利剑出击。 项目地址: https://…...
如何5分钟实现桌面股票实时监控:TrafficMonitor股票插件完全指南
如何5分钟实现桌面股票实时监控:TrafficMonitor股票插件完全指南 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 还在为错过重要行情而烦恼吗?想在工作时…...
10分钟搞定黑苹果:OpCore-Simplify自动化配置工具完全指南
10分钟搞定黑苹果:OpCore-Simplify自动化配置工具完全指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而烦恼吗…...
被遗忘的女程序员沙拉:用模拟程序为互联网奠基,却因家庭放弃编程
为互联网奠基的女程序员沙拉 数学教师沙拉博姆利用暑假编写代码,她之后开发的东西最终演变成了互联网。作者包括凯蒂哈夫纳、萨米亚布齐德、劳拉伊森西以及科学领域被遗忘的女性倡议组织。 沙拉的编程之路 沙拉博姆从加州大学洛杉矶分校获得教学学位后,投…...
SVN 报错 Previous operation has not finished,提示需要 clean up
SVN报错"Previous operation has not finished"通常是由于操作中断导致工作副本被锁定。 解决方法按优先级推荐: 1)首选执行Cleanup操作,勾选"Cleanup working copy status"和"Break write locks";…...
紧急更新!Midjourney v6.6对洛可可风格支持突降37%?立即启用这5个兼容性补丁prompt,保住你的商业项目交付期
更多请点击: https://intelliparadigm.com 第一章:Midjourney v6.6洛可可风格兼容性危机全景速览 Midjourney v6.6 发布后,大量用户在生成洛可可(Rococo)风格图像时遭遇显著退化:繁复卷曲的藤蔓纹样被简化…...
Visual Studio Uninstaller:深度系统清理架构与BURN引擎逆向工程实践
Visual Studio Uninstaller:深度系统清理架构与BURN引擎逆向工程实践 【免费下载链接】VisualStudioUninstaller Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is desig…...
FRED案例:矩形微透镜阵列
介绍小透镜阵列可应用在很多方面,其中包含光束均匀化。本文演示了一个用于在探测器上创建均匀的非相干照度的成像微透镜阵列的设计。输入光束具有高斯轮廓,半宽度等于微透镜阵列大小,并且显示了其功率轮廓被微透镜阵列消除掉。系统输出简单示…...
多角色对话配音方案:顶伯 一键生成有声剧,支持角色区分
多角色对话配音方案:顶伯 一键生成有声剧,支持角色区分在制作有声剧、播客或短视频时,多角色对话配音往往是最耗时的一环。传统方法需要为每个角色分别录制、剪辑、混音,不仅效率低下,还容易因音色不统一而影响沉浸感。…...
如何验证代理IP纯净度?2026年IP检测与优化指南
一个“脏”IP,如同一个有问题的身份证,它可能会让你的账户面临高风险,甚至被平台封禁。为了避免这种情况,验证和优化代理IP的纯净度成为了不可忽视的环节。本文将为你提供一套2026年最新的代理IP纯净度检测与优化方案,…...
