層級鎖筆記

注意看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;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715539.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kafka文件存儲機制和消費者

1.broker文件存儲機制 去查看真正的存儲文件&#xff1a; 在/opt/module/kafka/datas/ 路徑下 kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index 如果是6415那么這個會存儲在563的log文件之中&#xff0c;因為介于6410和10090之間。 2.…

java mysql八股

mysql中如何定位慢查詢 表象&#xff1a;頁面加載過慢、接口壓測響應時間較長&#xff08;超過1秒&#xff09; 可以采用開源工具如Arthas以及Skywalking&#xff0c;使用skywalking可以檢測出哪個接口過慢。同時可以在mysql中開啟慢日志查詢&#xff0c;設置值為2秒&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人車輛檢測與計數(Python+PySide6界面+訓練代碼)

摘要&#xff1a;開發行人車輛檢測與計數系統對于提升城市交通管理和監控系統的效率至關重要。本篇博客詳細介紹了如何利用深度學習構建一個行人車輛檢測與計數系統&#xff0c;并提供了完整的實現代碼。該系統基于強大的YOLOv8算法&#xff0c;并結合了YOLOv7、YOLOv6、YOLOv5…

[Java 探索者之路] 一個大廠都在用的分布式任務調度平臺

分布式任務調度平臺是一種能夠在分布式計算環境中調度和管理任務的系統&#xff0c;在此環境下&#xff0c;各個任務可以在獨立的節點上運行。它有助于提升資源利用率&#xff0c;增強系統擴展性以及提高系統對錯誤的容忍度。 文章目錄 1. 分布式任務調度平臺1. 基本概念1.1 任…

Linux文本處理三劍客:sed

在Linux操作系統中&#xff0c;grep、sed、awk被稱為文本操作“三劍客”&#xff0c;上一期中&#xff0c;我們將詳細介紹grep的基本使用方法&#xff0c;希望能夠幫助到有需要的朋友&#xff0c;現在&#xff0c;我們繼續學習sed。 我會參考官方文檔來做翻譯理解。下面正式開…

使用Java同步Linux服務器時間

前言 公司客戶線上服務器采用的是UOS系統&#xff0c;實施發現系統不會同步時間&#xff0c;并且時間有真實時間有偏差&#xff0c;本意想安裝NTP授時服務&#xff0c;結果發現UOS安裝NTP都要折騰好久&#xff0c;遂采用Java來曲線救國了。 添加依賴 <dependency><…

Java基于SpringBoot的旅游網站的設計與實現論文

目 錄 摘 要 2 Abstract 3 1.1 課題開發的背景 4 1.2 課題研究的意義 4 1.3 研究內容 5 第二章 系統開發關鍵技術 6 2.1 JSP技術介紹 6 2.2 JAVA簡介 6 2.3 MyEclipse開發環境 7 2.4 Tomcat服務器 7 2.5 Spring Boot框架 7 2.6 MySQL數據庫 8 第三章 系統分析 9 3.1 系統可行性…

實踐航拍小目標檢測,基于YOLOv8全系列【n/s/m/l/x】參數模型開發構建無人機航拍場景下的小目標檢測識別分析系統

關于無人機相關的場景在我們之前的博文也有一些比較早期的實踐&#xff0c;感興趣的話可以自行移步閱讀即可&#xff1a; 《deepLabV3Plus實現無人機航拍目標分割識別系統》 《基于目標檢測的無人機航拍場景下小目標檢測實踐》 《助力環保河道水質監測&#xff0c;基于yolov…

使用 llama.cpp 在本地部署 AI 大模型的一次嘗試

對于剛剛落下帷幕的2023年,人們曾經給予其高度評價——AIGC元年。隨著 ChatGPT 的火爆出圈,大語言模型、AI 生成內容、多模態、提示詞、量化…等等名詞開始相繼頻頻出現在人們的視野當中,而在這場足以引發第四次工業革命的技術浪潮里,人們對于人工智能的態度,正從一開始的…

JVM(5)

垃圾回收相關 垃圾收集器 警告:純八股文! 如果說上面我們講的收集算法是內存回收的方法論,那么垃圾收集器就是內存回收的具體體現. 垃圾收集器的作用:垃圾收集器是為了保證程序能夠正常,持久運行的一種技術,它是將程序中不用的死亡對象也就是垃圾對象進行清除,從而保證新的…

第四十五天| 322. 零錢兌換、279.完全平方數

Leetcode 322. 零錢兌換 題目鏈接&#xff1a;322 零錢兌換 題干&#xff1a;給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能…

AI大語言模型【成像光譜遙感技術】ChatGPT應用指南

遙感技術主要通過衛星和飛機從遠處觀察和測量我們的環境&#xff0c;是理解和監測地球物理、化學和生物系統的基石。ChatGPT是由OpenAI開發的最先進的語言模型&#xff0c;在理解和生成人類語言方面表現出了非凡的能力。本文重點介紹ChatGPT在遙感中的應用&#xff0c;人工智能…

vscode + git

寫在前面&#xff1a; origin分支&#xff1a; 當我們在使用git clone的時候&#xff0c;git會自動地將這個遠程的repo命名為origin&#xff0c;拉取它所有的數據之后&#xff0c;創建一個指向它master的指針&#xff0c;命名為origin/master&#xff0c;之后會在本地創建一個…

C#單向鏈表實現:用泛型類在當前位置插入新數據的方法Insert()

一、涉及到的知識點 1.ListNode<T>類 ListNode<T>是一個泛型類&#xff0c;用于表示鏈表中的一個節點。Value和Next屬性是ListNode<T>最基本的屬性&#xff0c;用于表示節點的值和指向下一個節點的引用。但是&#xff0c;完全可以根據實際需求添加其他屬性&…

雙非二本找實習前的準備day5

學習目標&#xff1a; 每天2-3到簡單sql&#xff08;刷完即止&#xff09;&#xff0c;每天復習代碼隨想錄上的題目3道算法&#xff08;時間充足可以繼續&#xff09;&#xff0c;今天的八股背少一點&#xff0c;MySQL和Redis各1-2道好了&#xff0c;主攻復習是java基礎 今日…

C語言5道編程題簡單介紹(三)

1、打印楊輝三角 程序分析&#xff1a; 結構如下所示&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1代碼如下&#xff1a; #include <stdio.h>int main() {int i,j;int a[10][10];printf("\n");for(i0;i<10;i) {a[i][0]1;a…

Vuex 是什么?它在 Vue 應用中扮演什么角色?解釋一下 Vuex 的狀態管理模式。如何在 Vuex 中進行異步操作?

一、Vuex 是什么&#xff1f; Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態&#xff0c;并以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 的出現解決了多個組件間共享狀態的問題&#xff0c;使得狀態管理變得更加直…

#WEB前端(HTML屬性)

1.實驗&#xff1a;a,img 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; a: href插入超鏈接 默認情況下在本窗口打開鏈接, target可以設置打開的窗口,parent在父窗口打開&#xff0c;blank新開串口打開,top在頂層串口打開,self為默認在本窗口打開 img: 插入圖片 可以插…

解析/區分MOS管的三個引腳G、S、D(NMOS管和PMOS管)

MOS管的三個引腳分別是Gate&#xff08;柵極&#xff09;、Source&#xff08;源極&#xff09;和Drain&#xff08;漏極&#xff09;。以下是詳細介紹&#xff1a; Gate&#xff08;柵極&#xff09;。這是控制MOS管開關的關鍵引腳&#xff0c;用于控制電流的流通。Source&…

智能分析網關V4安全帽檢測/反光衣檢測/通用工服檢測算法及應用

TSINGSEE青犀視頻智能分析網關V4內置了近40種AI算法模型&#xff0c;支持對接入的視頻圖像進行人、車、物、行為等實時檢測分析&#xff0c;上報識別結果&#xff0c;并能進行語音告警播放。硬件管理平臺支持RTSP、GB28181協議、以及廠家私有協議接入&#xff0c;可兼容市面上常…