C++中互斥鎖、共享鎖深度解析

一,互斥鎖

互斥鎖(Mutex,全稱 Mutual Exclusion)是并發編程中用于保護共享資源的核心同步機制。它通過確保同一時間僅有一個線程訪問臨界區(Critical Section),解決多線程環境下的數據競爭和不一致性問題。

二,std::mutex

1,頭文件

#include <mutex>

2,特性

  • 不支持拷貝構造和拷貝賦值,只有默認構造
  • std::mutex對象不支持移動語義,不支持swap。
  • std::mutex是非遞歸鎖,遞歸鎖使用std::recursive_mutex
  • unlock()次數過多時,會產生未定義的行為

3,成員函數

函數說明

lock()

獲取鎖,鎖被其他線程占用時阻塞當前線程。
unlock()釋放鎖(必須由鎖的持有線程調用)。
try_lock()獲取鎖,鎖被占用時返回false,但不阻塞當前線程。鎖未被占用且獲取鎖成功時返回true。

4,示例代碼

#include <mutex>
#include <iostream>
#include <thread>static std::mutex tex;
void test01()
{std::lock_guard<std::mutex> locker(tex);std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;
}void test02()
{tex.lock();std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;tex.unlock();
}void test03()
{if (tex.try_lock()){std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;tex.unlock();}
}int main()
{std::mutex tess;for (int i = 0; i < 15; i++){std::thread th(test03);//std::thread th(test02);//std::thread th(test01);th.detach();}system("pause");std::cout << "Hello World!\n";
}

5,源碼說明

根據源碼解釋mutex的特性。

_EXPORT_STD class mutex : public _Mutex_base { // class for mutual exclusion
public:// 只支持無參構造mutex() noexcept = default;// 不支持拷貝構造mutex(const mutex&)            = delete;// 不支持拷貝賦值mutex& operator=(const mutex&) = delete;
};
    void lock() {if (_Mtx_lock(_Mymtx()) != _Thrd_result::_Success) {// 未定義行為,僅發生在普通互斥鎖上(N4950標準 [thread.mutex.requirements.mutex.general]/6 條款)_STD _Throw_Cpp_error(_RESOURCE_DEADLOCK_WOULD_OCCUR);}if (!_Verify_ownership_levels()) {// only occurs for recursive mutexes (N4950 [thread.mutex.recursive]/3)// POSIX specifies EAGAIN in the corresponding situation:// https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html_STD _Throw_Cpp_error(_RESOURCE_UNAVAILABLE_TRY_AGAIN);}}

下面是部分代碼行逐行說明:

_Mtx_lock(_Mymtx()) != _Thrd_result::_Success

_Mymtx()是獲取當前互斥量底層原生句柄。在Windows平臺上,C++標準庫互斥量(std::mutex)的底層原生句柄是CRITICAL_SECTION對象。這是Windows系統提供的高性能線程同步原語,完全由Windows內核創建和管理。

Windows CRITICAL_SECTION本質上是遞歸的。std::mutex的非遞歸特性是由C++標準庫在上層強制實現的。將底層互斥量句柄_Mymtx()傳遞給_Mtx_lock()函數,_Mtx_lock()函數嘗試鎖定互斥鎖,此時會執行遞歸檢測,如果是遞歸加鎖,會導致鎖定失敗,然后拋出異常:

_STD _Throw_Cpp_error(_RESOURCE_DEADLOCK_WOULD_OCCUR);

_Verify_ownership_levels()會檢查遞歸鎖的嵌套深度是否超限。超限時拋出異常。

三,std::recursive_mutex

與std::mutex相比,recursive_mutex是遞歸鎖。它允許同一線程多次獲取鎖而不會導致異常。

1,特性

  • recursive_mutex是遞歸鎖,它可以多次調用lock和try_lock(),每次調用會增加內部的鎖計數
  • 多次加鎖之后,必須調用同等次數的unlock(),才能解鎖
  • 與std::mutex相同,不支持移動語義,不支持swap
  • unlock()次數過多時,會產生未定義的行為

2,成員函數

函數說明

lock()

獲取鎖,鎖被其他線程占用時阻塞當前線程。獲取鎖成功時,增加鎖計數。
unlock()減少鎖計數,鎖計數為0時釋放鎖(必須由鎖的持有線程調用)。
try_lock()獲取鎖,鎖被占用時返回false,但不阻塞當前線程。鎖未被占用且獲取鎖成功時返回true,同時增加鎖計數。

3,示例代碼

static std::recursive_mutex tex;
void test01()
{std::lock_guard<std::recursive_mutex> locker(tex);std::lock_guard<std::recursive_mutex> locker1(tex); // 可多次加鎖std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;
}void test03()
{if (tex.try_lock()){if (tex.try_lock()){std::cout << "A" << std::endl;if (tex.try_lock()){std::cout << "B" << std::endl;if (tex.try_lock()){tex.lock();std::cout << "====================" << std::endl;}}}tex.unlock(); tex.unlock(); tex.unlock(); tex.unlock(); tex.unlock();}
}

四,std::timed_mutex

std::timed_mutex(定時互斥鎖)是 C++11 標準庫提供的帶有超時功能的互斥量類型,它在 std::mutex 基礎上增加了嘗試獲取鎖直到超時的能力,適用于需要避免無限期阻塞的場景。

1,特性

  • std::timed_mutex對象不支持拷貝構造和拷貝賦值
  • std::timed_mutex對象不支持移動語義,不支持swap
  • std::timed_mutex是非遞歸鎖
  • unlock()次數過多時,會產生未定義的行為

2,成員函數

函數說明
lock()阻塞直到獲得鎖
unlock()釋放鎖
try_lock()立即嘗試獲取鎖(非阻塞)
try_lock_for(rel_time)相對時間段內嘗試獲取鎖(超時返回?false
try_lock_until(abs_time)絕對時間點前嘗試獲取鎖(超時返回?false

3,示例代碼

#include <mutex>
#include <iostream>
#include <thread>static std::timed_mutex timeMutex;void test04()
{if (!timeMutex.try_lock_for(std::chrono::milliseconds(1000))){std::cout << "獲取鎖超時" << std::endl;}else{std::cout << "A" << std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模擬工作timeMutex.unlock();}
}int main()
{std::mutex tess;for (int i = 0; i < 15; i++){std::thread th(test04);th.detach();}system("pause");std::cout << "Hello World!\n";
}

五:std::recursive_timed_mutex

超時遞歸鎖。與timed_mutex相比,允許遞歸加鎖。

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

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

相關文章

Qt中的QWebSocket 和 QWebSocketServer詳解:從協議說明到實際應用解析

前言 本篇圍繞 QWebSocket 和 QWebSocketServer&#xff0c;從協議基礎、通信模式、數據傳輸特點等方面展開&#xff0c;結合具體接口應用與實戰案例進行說明。 在實時網絡通信領域&#xff0c;WebSocket 技術以其獨特的全雙工通信能力&#xff0c;成為連接客戶端與服務器的重要…

機器學習 —— 決策樹

機器學習 —— 決策樹&#xff08;Decision Tree&#xff09;詳細介紹決策樹是一種直觀且易于解釋的監督學習算法&#xff0c;廣泛應用于分類和回歸任務。它通過模擬人類決策過程&#xff0c;將復雜問題拆解為一系列簡單的判斷規則&#xff0c;最終形成類似 “樹” 狀的結構。以…

車規MCU軟錯誤防護技術的多維度分析與優化路徑

摘要&#xff1a;隨著汽車電子技術的飛速發展&#xff0c;微控制單元&#xff08;MCU&#xff09;在汽車電子系統中的應用日益廣泛。然而&#xff0c;大氣中子誘發的單粒子效應&#xff08;SEE&#xff09;對MCU的可靠性構成了嚴重威脅。本文深入探討了軟錯誤防護技術在車規MCU…

原生微信小程序實現語音轉文字搜索---同聲傳譯

效果展示 ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/23257ce3b6c149a1bb54fd8bc2a05c68.png#pic_center 注意&#xff1a;引入同聲傳譯組件請看這篇文章 1.search.wxml <view class"search-page"><navigation-bar title"搜索" …

Wireshark安裝過程缺失vc_runtimeMinimum_x64.msi文件,安裝 Visual C++ Redistributable

一、我大意了 一開始是Npcap裝不上。 在這個網站下的&#xff1a; Wireshark (kafan58.com) 安裝程序&#xff1a; 安裝過程&#xff1a; 無語死了&#xff0c;感覺被騙了......外網下的才是最正版的。 二、外網正版 下載最新的4.4.8版本Wireshark重新安裝 2.1 vc_runtime…

高通平臺Wi-Fi Display學習-- 調試 Wi-Fi Display 問題

4.1 調試 WFD 性能 4.1.1 通過啟用調節器模式驗證 WFD 當系統設為調節器模式時,設備的運行時鐘將達到峰值。要在系統中啟用調節器模式,應 在序列中輸入以下命令: 1. adb shell stop mpdecision 2. adb shell echo 1→/sys/devices/system/cpu/cpu1/online 3. adb shell…

5G專網與SD-WAN技術融合:某飲料智能工廠網絡架構深度解析

隨著工業互聯網的快速發展&#xff0c;制造業正從傳統的生產模式向智能化、數字化方向轉型。某飲料智能工廠項目創新性地引入了5G專網與SD-WAN技術&#xff0c;形成了“連接-計算-應用-安全”的全鏈條網絡架構。本文將深入剖析這兩種技術在智能工廠中的應用場景、部署架構&…

Java項目:基于SSM框架實現的公益網站管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+答辯PPT+遠程部署】

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本公益網站就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息&#x…

向華為學習——IPD流程體系之IPD術語

第一章 IPD體系 1.1集成產品開發IPD Integrated Product Development,IPD是一種領先的、成熟的產品開發的管理思想和管理模式。它是根據大量成功的產品開發管理實踐總結出來的,并被大量實踐證明的高效的產品開發模式。通過IPD,可建立起基于市場和客戶需求驅動的集成產品開…

落霞歸雁:從自然之道到“存內計算”——用算法思維在芯片里開一條“數據高速航道”

作者 落霞歸雁&#xff08;CSDN首發&#xff0c;轉載請注明&#xff09; 段落一 現象&#xff1a;當“摩爾”老去&#xff0c;數據卻在狂奔 過去 30 年&#xff0c;CPU 頻率翻了 60 倍&#xff0c;而 DRAM 帶寬只翻了 20 倍。算力與帶寬的剪刀差&#xff0c;讓“計算”變成“等…

StyleX:Meta推出的高性能零運行時CSS-in-JS解決方案

簡介 StyleX 是由 Meta 開發的零運行時 CSS-in-JS 解決方案&#xff0c;在構建時將樣式編譯為靜態 CSS&#xff0c;消除運行時開銷。 核心特性 零運行時開銷 – 構建時編譯為靜態 CSS類型安全 – 完整的 TypeScript 支持原子化 CSS – 自動生成原子化類名&#xff0c;最小化…

LINUX 85 SHElL if else 前瞻 實例

問題 判斷用戶是否存在 id user id $user變量判斷vsftpd軟件包被安裝 rpm -q vsftpd rpm -ql vsftpd >& null[rootweb ~]# rpm -ql vsftpd >/dev/null 2>&1 您在 /var/spool/mail/root 中有郵件yum install vsftpd 內核主版本判斷 uname -rcut -d[rootweb ~]#…

2025 年非關系型數據庫全面指南:類型、優勢

非關系型數據庫的分類與特點隨著數據量呈指數級增長和數據類型日益多樣化&#xff0c;傳統關系型數據庫在處理海量非結構化數據時面臨著嚴峻挑戰。非關系型數據庫&#xff08;NoSQL&#xff09;應運而生&#xff0c;它摒棄了傳統關系模型的約束&#xff0c;采用更靈活的數據存儲…

深度殘差網絡ResNet結構

Deep Residual Learning for Image Recognition&#xff0c;由Kaiming He、Xiangyu Zhang、Shaoqing Ren和Jian Sun于2016年發表在CVPR上 1512.03385 (arxiv.org)https://arxiv.org/pdf/1512.03385 下圖中&#xff0c;左側為VGG19網絡&#xff0c;中間為34層的普通網絡&#xf…

python筆記--socket_TCP模擬瀏覽器實現

""" 1,導包 2,創建TCP套接字 3,建立連接 4,拼接客戶端請求報文 5,發送請求報文 6,接收響應報文 7,過濾出html頁面 8,保存為html文件 9,關閉套接字 """ # 1,導包 import socket # 2,創建TCP套接字 tcp_socketsocket.socket(socket.AF_INET,socket…

西門子PLC基礎指令4:置位指令 S、復位指令 R

布爾指令 1、置位指令 S Setbit 是要進行置位操作的地址的首地址&#xff0c;N 是從該首地址開始連續置位的位數 。 LD I0.0 // 裝載輸入繼電器I0.0的狀態&#xff08;當I0.0為ON時&#xff0c;執行后續指令&#xff09; S Q0.0, 3 // 從Q0.0開始&#xff0c;連續置位3…

2.3 子組件樣式沖突詳解

Vue2組件樣式沖突的成因與解決方案組件樣式沖突的根本原因在Vue單頁面應用中&#xff0c;所有組件的DOM結構最終都會合并到同一個index.html 頁面中。若子組件未使用scoped屬性&#xff0c;其樣式會默認全局生效&#xff0c;導致不同組件中相同選擇器&#xff08;如h1、.contai…

26-數據倉庫與Apache Hive

1.數據倉庫 是什么&#xff1f;解決什么&#xff1f;1.1 數據倉庫Data Warehouse 數倉 / DW 是一個用于存儲、分析、報告的數據系統.目的&#xff1a;構建面向分析的集成數據環境&#xff0c;分析結構為企業提供決策支持。數倉專注于分析數倉本身不“”生產“”數據&#xff0c…

前端開發技術教學(二)

書接上回&#xff1a;前端開發技術教學(一) -CSDN博客 必要資源&#xff1a;TRAE - The Real AI Engineer 目錄 一) 自定義函數 - function 二) DOM操控 DOM事件 a.) onclick b.) onkeydown 三) AI寫代碼 書接上回說到的前端3種主語言以及其用法&#xff0c;這期我們…

設計模式 - 組合模式:用樹形結構處理對象之間的復雜關系

文章目錄一、引言二、模式原理分析三、代碼示例四、核心要點五、使用場景分析六、案例七、為何使用組合模式&#xff1f;八、優缺點剖析九、最佳實踐建議十、總結一、引言 “組合模式”&#xff08;Composite Pattern&#xff09;常被誤解為“組合關系”。前者專注于將對象組合…