层级锁笔记
注意看test_hierarchy_lock函数:如果thread t2的不注释,就会报错。
这是因为层级锁 更强调单个线程内上锁的顺序。
线程t2已经获取了hmtx2,再试图获取hmtx1就会因为违反层级顺序而抛出异常。
#include <mutex>
#include <thread>
//层级锁
class hierarchical_mutex {
public:explicit hierarchical_mutex(unsigned long value) :_hierarchy_value(value),_previous_hierarchy_value(0) {}hierarchical_mutex(const hierarchical_mutex&) = delete;hierarchical_mutex& operator=(const hierarchical_mutex&) = delete;void lock() {check_for_hierarchy_violation(); // 必须_this_thread_hierarchy_value >= 待获取锁的层级值 当前层级值,才继续_internal_mutex.lock();update_hierarchy_value(); // _this_thread_hierarchy_value 变成 待获取锁的层级值}void unlock() {if (_this_thread_hierarchy_value != _hierarchy_value) {throw std::logic_error("mutex hierarchy violated");}_this_thread_hierarchy_value = _previous_hierarchy_value;_internal_mutex.unlock();}bool try_lock() {check_for_hierarchy_violation();if (!_internal_mutex.try_lock()) {return false;}update_hierarchy_value();return true;}
private:std::mutex _internal_mutex;//当前层级值unsigned long const _hierarchy_value;//上一次层级值unsigned long _previous_hierarchy_value;//本线程记录的层级值static thread_local unsigned long _this_thread_hierarchy_value;void check_for_hierarchy_violation() {if (_this_thread_hierarchy_value <= _hierarchy_value) {throw std::logic_error("mutex hierarchy violated");}}void update_hierarchy_value() {_previous_hierarchy_value = _this_thread_hierarchy_value;_this_thread_hierarchy_value = _hierarchy_value;}
};thread_local unsigned long hierarchical_mutex::_this_thread_hierarchy_value(ULONG_MAX);void test_hierarchy_lock() {hierarchical_mutex hmtx1(1000);hierarchical_mutex hmtx2(500);std::thread t1([&hmtx1, &hmtx2]() {std::this_thread::sleep_for(std::chrono::milliseconds(500));hmtx1.lock();hmtx2.lock();hmtx2.unlock();hmtx1.unlock();});std::thread t2([&hmtx1, &hmtx2]() {hmtx2.lock();
// hmtx1.lock();
// hmtx1.unlock();hmtx2.unlock();});t1.join();t2.join();
}int main(){test_hierarchy_lock();return 0;
}
相关文章:
层级锁笔记
注意看test_hierarchy_lock函数:如果thread t2的不注释,就会报错。 这是因为层级锁 更强调单个线程内上锁的顺序。 线程t2已经获取了hmtx2,再试图获取hmtx1就会因为违反层级顺序而抛出异常。 #include <mutex> #include <thread&g…...
基于SpringBoot+Vue 的专家医院预约挂号系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
计算机基础专升本笔记十二-Excel常用快捷键大全
计算机基础专升本笔记十二-Excel常用快捷键大全 Excel常用快捷键 按键作用Ctrl 0隐藏列Ctrl 1设置单元格格式Ctrl 2添加或取消字体加粗Ctrl 3添加或取消字体倾斜Ctrl 4添加或取消下划线Ctrl 5添加或取消删除线Ctrl 6隐藏或显示图形Ctrl 7隐藏工具栏Ctrl 8隐藏或显示…...
制作耳机壳的UV树脂和塑料材质相比优势有哪些?
制作耳机壳的UV树脂相比塑料材质有以下优势: 高强度与耐磨性:UV树脂具有高强度和耐磨性,能够更好地保护耳机内部零件,延长耳机使用寿命。相比之下,塑料材质可能较易磨损或刮伤。耐高温:UV树脂具有较好的耐…...
JS(JavaScript)中如何实现,复选框checkbox多选功能
起始界面: 代码元素: <p><input type"checkbox" id"checkedAll"> 全选按钮</p><p><input type"checkbox" class"cl"> 选项1</p><p><input type"checkbox&qu…...
直接修改zynq petalinux编译出来的rootfs.cpio.gz文件内容
xilinx zynq petalinux 默认编译打包出的SPI flash烧写启动文件是BOOT.BIN,然而每次需要修改rootfs内的文件时都要重新build rootfs 然后再 package一次才能生成新的BOOT.bin文件,地球人都知道petalinux编译一次是很耗时间的,那么有没有什么简…...
什么是 Golang 类型断言
类型断言:用于检查某个接口是否包含某个具体类型,语法x.(T),x是一个接口类型表达式,T是具体的类型,如果x包含的值可以被转换成T类型,则是ok 在Go语言中,任何类型的值都属于空接口类型。空接口类…...
mysql数据库root权限读写文件
如果没有shell,只有数据库权限的情况下: 1. udf 提权提示没有目录:使用数据流创建目录 1. select xxx into outfile C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\::$INDEX_ALLOCATION;2. select xxx into outfile C:\\phpstudy_pro\…...
力扣爆刷第88天之hot100五连刷26-30
力扣爆刷第88天之hot100五连刷26-30 文章目录 力扣爆刷第88天之hot100五连刷26-30一、142. 环形链表 II二、21. 合并两个有序链表三、2. 两数相加四、19. 删除链表的倒数第 N 个结点五、24. 两两交换链表中的节点 一、142. 环形链表 II 题目链接:https://leetcode.…...
Ethersacn的交易数据是什么样的(2)
分析 Raw Transanction RLP(Recursive Length Prefix)是一种以太坊中用于序列化数据的编码方式。它被用于将各种数据结构转换为二进制格式,以便在以太坊中传输和存储。RLP 是一种递归的编码方式,允许对复杂的数据结构进行编码。所…...
学习Android的第二十二天
目录 Android ContextMenu 上下文菜单 ContextMenu 范例 参考文档 Android SubMenu 子菜单 范例 参考文档 Android PopupMenu 弹出菜单 范例 参考文档 Android ContextMenu 上下文菜单 在Android开发中,ContextMenu(上下文菜单)为…...
JavaScript——流程控制(程序结构)
JavaScript——流程控制(程序结构) 流程控制就是来控制我们的代码按照什么结构顺序来执行。更倾向于一种思想结构。 流程控制分为三大结构:顺序结构、分支结构、循环结构 1、顺序结构 代码从上往下依次执行,从A到B执行&#x…...
如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?
原文链接:如何用ChatGPTGEEENVIPython进行高光谱,多光谱成像遥感数据处理? 第一:遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二:ChatGPT ChatGPT可以做什么? ChatGPT演示使用 …...
AIGC工具( 7个 )
人工智能技术有好的一方面,又不好的地方,要区别对待,吸取精华,去其糟粕。目前市场上有很多AI大模型,可以支持聊天,写文稿,创作等,部分可以生成图片,以下是7个很不错的免费…...
学习Java的第一天
一、Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。 后来 Sun 公司被 Oracle (甲骨文)公司收购,Jav…...
【设计模式】工厂模式与抽象工厂模式
工厂方法 以图书馆管理系统为例,需要API提供查询不同专业分类的书目列表,一般实现, class LibraryManager { public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type TA) {return ...;} else if (type TB) {} el…...
使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件
plasmo:GitHub - PlasmoHQ/plasmo: 🧩 The Browser Extension Framework plasmo是一个开发浏览器插件的框架,支持使用react和vue等技术,而且不用手动管理manifest.json文件,框架会根据你在框架中的使用,自…...
python并发 惰性处理大型数据集
惰性计算是一种编程策略,它使得程序在何时执行计算的决定推迟到需要结果时才进行。这种策略的好处在于,它允许程序处理大规模数据或者需要大量计算的任务时节省内存和计算资源。 举例来说,当我们调用 Python 中的 range() 函数时,…...
Docker将本地的镜像上传到私有仓库
使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…...
[LeetBook]【学习日记】有效数字——状态机
题目 有效数字 有效数字(按顺序)可以分成以下几个部分: 若干空格一个小数或者整数(可选)一个’e’或’E’,后面跟着一个整数若干空格 小数(按顺序)可以分成以下几个部分:…...
STM32F103C8T6多通道ADC轮询与DMA高效数据搬运实战
1. STM32F103C8T6多通道ADC采集基础 STM32F103C8T6这款性价比极高的Cortex-M3芯片内置了3个12位ADC模块,单个ADC最多支持16个外部通道和2个内部通道(温度传感器和VREFINT)。在实际项目中,比如需要同时监测多个传感器数据…...
7.Linux笔记:shell
1.shellshell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互。用户>shell>内核>硬件内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,内核决定一个程序…...
RISC-V开发板VisionFive 2 UEFI固件移植与启动实战指南
1. 项目概述:当RISC-V单板机拥抱UEFI 对于玩惯了x86平台或者树莓派的开发者来说,给一块单板计算机(SBC)刷写固件、配置启动项,可能已经轻车熟路。但当你把目光投向RISC-V架构,特别是像赛昉科技的VisionFiv…...
LSPatch:无需Root的Android应用模块化终极指南
LSPatch:无需Root的Android应用模块化终极指南 【免费下载链接】LSPatch LSPatch: A non-root Xposed framework extending from LSPosed 项目地址: https://gitcode.com/gh_mirrors/ls/LSPatch 你是否曾经羡慕iOS的越狱插件,却因Android设备未ro…...
AI工程师实战技能树:从特征工程到MLOps的完整指南
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的仓库,叫tqviet1978/ai-skills。光看名字,你可能会觉得这又是一个关于AI技能学习的普通教程合集。但当我点进去仔细研究后,发现它的定位和内容组织方式,与市面上大多数“AI学…...
AMD Ryzen处理器终极调试指南:SMU Debug Tool实战技巧与完整解决方案
AMD Ryzen处理器终极调试指南:SMU Debug Tool实战技巧与完整解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地…...
智能代理模式在渗透测试中的应用:pentestagent架构解析与实战
1. 项目概述与核心价值最近在安全测试和红队演练的圈子里,一个名为GH05TCREW/pentestagent的项目开始被频繁提及。乍一看这个名字,你可能会觉得它又是一个普通的渗透测试工具集,但当你真正深入去研究和使用它时,会发现它的设计理念…...
出口土耳其:关键注意事项与避坑指南
与土耳其贸易需重点关注收汇安全、海关政策及单证认证。掌握即期信用证规则、海关拍卖时限及使馆认证要求,是防范货款与货物风险的关键。一、收汇风险防范土耳其商人常要求赊账或开具空头支票,部分还以个人财产抵押开具汇票,此类方式风险极高…...
基于英创ARM9嵌入式主板实现双CAN接口的硬件设计与Linux驱动配置实战
1. 项目概述:为什么需要双CAN接口? 在工业自动化、汽车电子、新能源设备这些领域里,CAN总线就像设备之间的“神经系统”,负责传递各种控制指令和状态数据。一个CAN接口是基础,但当你需要同时连接两个独立的CAN网络&…...
终极CoreCycler教程:5分钟掌握CPU超频稳定性测试
终极CoreCycler教程:5分钟掌握CPU超频稳定性测试 【免费下载链接】corecycler Script to test single core stability, e.g. for PBO & Curve Optimizer on AMD Ryzen or overclocking/undervolting on Intel processors 项目地址: https://gitcode.com/gh_mi…...
