C++中如何使用互斥(1)------std::lock_guard

  • 操作系統:ubuntu22.04
  • IDE:Visual Studio Code
  • 編程語言:C++11

算法描述

std::lock_guard 是 C++11 引入的一個 RAII(Resource Acquisition Is Initialization)風格的鎖管理類,用于自動管理互斥鎖(mutex)的加鎖和解鎖,確保在任何情況下(包括異常)都能正確釋放鎖。

核心作用

  • 構造時加鎖
  • 析構時自動解鎖
  • 防止死鎖和資源泄漏
  • 異常安全

? 它是最簡單、最安全的互斥鎖管理方式,適用于大多數臨界區保護場景。

頭文件

#include <mutex>

基本語法

std::lock_guard<std::mutex> lock(mutex_object);
  • std::mutex:可以是任何標準互斥類型(如 std::mutex, std::recursive_mutex)
  • lock:作用域內的鎖對象,名字可自定義
  • mutex_object:已經定義的互斥量

使用示例

示例 1:保護共享變量

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
using namespace std;int counter = 0;
std::mutex mtx;  // 全局互斥鎖void safe_increment(int n) {for (int i = 0; i < n; ++i) {// { 作用域開始std::lock_guard<std::mutex> lock(mtx);  // 構造時加鎖counter++;  // 安全訪問共享資源// } 作用域結束,lock 析構,自動解鎖}
}int main() {vector<thread> threads;// 創建 4 個線程for (int i = 0; i < 4; ++i) {threads.emplace_back(safe_increment, 10000);}// 等待所有線程完成for (auto& t : threads) {t.join();}cout << "Final counter value: " << counter << endl;  // 應為 40000return 0;
}

構造函數

構造函數說明
explicit lock_guard(mutex_type& m);加鎖并管理 m
lock_guard(mutex_type& m, std::defer_lock_t);不加鎖,僅管理(但 lock_guard 不支持 defer_lock)?
lock_guard(mutex_type& m, std::adopt_lock_t);假設鎖已由當前線程持有,僅接管
?? 注意:std::lock_guard 不支持 std::defer_lock,它總是立即加鎖。如果需要延遲加鎖,請使用 std::unique_lock。

與 std::unique_lock 的對比

特性std::lock_guardstd::unique_lock
是否立即加鎖可延遲(defer_lock)
是否可手動解鎖是(unlock())
是否支持條件變量
靈活性低(簡單場景)高(復雜場景)
性能更高(輕量)稍低(有狀態)
推薦場景普通臨界區保護條件變量、復雜鎖邏輯

優點總結

? 異常安全:即使臨界區拋出異常,鎖也會被釋放
? 自動管理:無需手動調用 unlock()
? 代碼簡潔:避免忘記解鎖
? 性能高:無額外開銷

適用場景限制

? 不能用于需要嘗試加鎖(try_lock)的場景
? 不能用于需要條件變量(std::condition_variable)的場景
? 不能用于需要遞歸加鎖的場景(除非使用 std::recursive_mutex)

總結

std::lock_guard 是 C++ 中最簡單、最安全的互斥鎖管理方式,應作為首選工具用于保護臨界區。只要你的場景是“進入作用域加鎖,離開作用域解鎖”,就使用 std::lock_guard。

💡 記住一句話:“加鎖后立即創建 lock_guard,讓它幫你管理鎖的生命周期。”

如果你需要更復雜的鎖控制(如等待條件、手動解鎖),再考慮使用 std::unique_lock。

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

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

相關文章

AI算力提升7.5倍!英偉達發布新一代機器人超級計算機Jetson Thor,驅動物理AI革命

今天&#xff0c;NVIDIA 宣布其專為物理 AI 和機器人打造的新一代機器人計算機 Jetson Thor 正式發售。其中&#xff0c;Jetson AGX Thor 開發者套件售價為 3499 美元&#xff08;約合人民幣 2.5 萬元&#xff09;。NVIDIA 創始人兼首席執行官黃仁勛表示&#xff1a;“Jetson T…

【數學建模】如何總結數學建模中的層次分析法最好

模型簡介模型名稱&#xff1a;層次分析法核心問題類型&#xff1a;評價類核心思想和適用場景 核心思想&#xff1a;將大決策問題拆解成小比較問題&#xff0c;通過數學計算綜合最終結論&#xff1a;本質是人的主觀判斷轉換為客觀數據的工具[[適用場景]] 個人決策企業 / 項目決策…

`mmap` 系統調用詳解

mmap 是 Unix/Linux 系統中一個強大且多用途的系統調用&#xff0c;用于將文件或設備映射到進程的地址空間&#xff0c;實現內存映射I/O。 1. 函數的概念與用途 mmap&#xff08;內存映射&#xff09;函數允許程序將文件或其他對象直接映射到其地址空間&#xff0c;這樣文件內容…

深度剖析Spring AI源碼(二):Model抽象層 - “馴服”天下AI的“緊箍咒”

深度剖析Spring AI源碼&#xff08;二&#xff09;&#xff1a;Model抽象層 - “馴服”天下AI的“緊箍咒”上一章我們鳥瞰了Spring AI的宏偉藍圖&#xff0c;今天&#xff0c;我們要深入這座大廈的基石——Model抽象層。如果說Spring AI是連接Java與AI世界的橋梁&#xff0c;那…

永磁同步電機無速度算法--高頻脈振正弦波注入到兩相靜止坐標系

一、原理介紹采用一種改進的永磁同步電機低速無位置傳感器控制策略。與傳統的旋轉高頻信號注入法和脈振高頻信號注入法不同&#xff0c;該策略選擇向靜止坐標軸系注入高頻脈振信號&#xff0c;轉子位置估計信息可以通過載波電流響應提取。并使用一種類似于簡化型擴展卡爾曼濾波…

嵌入式學習日志————ADC模數轉換器之實驗

1.配置ADC的步驟①開啟RCC時鐘&#xff0c;包括ADC和GPIO的時鐘②配置GPIO&#xff0c;把相應端口配置成模擬輸入模式③配置多路開關&#xff0c;把左邊的通道接入右邊的規則組列表里④配置ADC轉換器⑤調用ADC_Cmd函數&#xff0c;開啟ADC2.庫函數配置ADCCLK分頻器void RCC_ADC…

Java設計模式之《狀態模式》

目錄 1、狀態模式 1.1、介紹 1.2、設計背景 1.3、適用場景 2、實現 2.1、if-else實現 2.2、狀態模式實現 2.3、最終版 1、關于if-else的優化 2、狀態模式下的優化 3、ArrayList 配置“狀態流” 3、總結 前言 關于Java的設計模式分類如下&#xff1a; 對于狀態模式…

three.js+WebGL踩坑經驗合集(9.2):polygonOffsetFactor工作原理大揭秘

本篇延續上篇內容&#xff1a; three.jsWebGL踩坑經驗合集(9.1):polygonOffsetUnits工作原理大揭秘-CSDN博客 跟polygonOffsetUnits相比&#xff0c;polygonOffsetFactor的系數m要復雜得多&#xff0c;因為它跟平面的視角相關&#xff0c;而不像r那樣&#xff0c;在一個固定的…

C++高級特性與設計模式答案

目錄 C++高級特性與設計模式:從資源管理到架構設計 一、C++高級特性:超越基礎語法的利器 1. 什么是RAII(資源獲取即初始化)?它有什么作用? 實現原理 核心作用 2. 什么是Pimpl慣用法?它有什么優勢? 實現方式 核心優勢 3. 什么是CRTP(奇異遞歸模板模式)?它的應用場景是…

論文閱讀:arxiv 2025 Can You Trick the Grader? Adversarial Persuasion of LLM Judges

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Can You Trick the Grader? Adversarial Persuasion of LLM Judges https://arxiv.org/pdf/2508.07805 https://www.doubao.com/chat/17534937260220418 文章目錄論文翻譯…

6pen Art

本文轉載自&#xff1a;6pen Art - Hello123工具導航 ** 一、&#x1f3a8; 6pen 是什么&#xff1f; 6pen 是一款由國內團隊開發的 AI 繪畫工具&#xff0c;讓你只需用文字描述想法&#xff0c;就能瞬間生成驚艷的視覺畫作。不管是寫實風景還是抽象概念&#xff0c;它都能理…

Let‘s Encrypt證書在 Android5.x 的設備上報錯

報錯信息&#xff1a; com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.at com.android.volley.toolbox.NetworkUtility.shouldRetryException(N…

C語言數組名與sizeof的深層關聯

要理解 “數組名本質代表整個數組的類型和內存塊” 與 “sizeof(arr) 輸出總字節數” 的關聯&#xff0c;核心是抓住 sizeof 運算符的設計邏輯 和 數組類型的本質屬性—— 這兩者是直接掛鉤的&#xff0c;我們一步步拆解&#xff1a;第一步&#xff1a;先明確 sizeof 的核心作用…

最近對javashop做了壓力測試:百萬級并發下完全不是問題

最近對 javashop 做了壓力測試&#xff1a;百萬級并發下完全不是問題 在電商行業競爭白熱化的今天&#xff0c;系統性能直接決定了用戶體驗和企業商業成功。本文基于《Javashop 壓測報告》&#xff0c;從技術架構、核心指標、業務價值三大維度深度解析其性能優勢&#xff0c;并…

Java大廠面試實戰:從Spring Boot到微服務架構的全鏈路技術解析

Java大廠面試實戰&#xff1a;從Spring Boot到微服務架構的全鏈路技術解析 面試場景&#xff1a;某互聯網大廠Java后端開發崗 面試官&#xff08;嚴肅&#xff09;&#xff1a;謝飛機&#xff0c;我們今天來聊點硬核的。先說說你對Java生態的理解。 謝飛機&#xff08;撓頭&…

在分布式環境下正確使用MyBatis二級緩存

在分布式環境下使用 MyBatis 二級緩存&#xff0c;核心挑戰是解決多節點緩存一致性問題。單機環境中&#xff0c;二級緩存是內存級別的本地緩存&#xff0c;而分布式環境下多節點獨立部署&#xff0c;本地緩存無法跨節點共享&#xff0c;易導致 “緩存孤島” 和數據不一致。本文…

血緣元數據采集開放標準:OpenLineage Integrations Apache Spark Quickstart with Jupyter

OpenLineage 是一個用于元數據和血緣采集的開放標準&#xff0c;專為在作業運行時動態采集數據而設計。它通過統一的命名策略定義了由作業&#xff08;Job&#xff09;、運行實例&#xff08;Run&#xff09;和數據集&#xff08;Dataset&#xff09; 組成的通用模型&#xff0…

人工智能之數學基礎:離散隨機變量和連續隨機變量

本文重點 隨機變量是概率論與統計學中的核心概念,用于將隨機現象的抽象結果轉化為可量化的數值。根據取值特性的不同,隨機變量可分為離散型和連續型兩大類。 在前面的課程中我們學習了隨機變量,隨機變量可以理解為一個函數,通過這個函數我們就可以將隨機試驗中的結果數值…

SQL語句(查詢)

單表查詢 常量查詢 讓我們來看一個具體的 SQL 代碼和結果示例&#xff0c;假設有一張名為 orders 的數據表&#xff0c;它存儲了訂單信息&#xff0c;包括訂單編號&#xff08;order_id&#xff09;、商品單價&#xff08;unit_price&#xff09;、購買數量&#xff08;quantit…

Java 大視界 -- Java 大數據機器學習模型在金融市場波動預測與資產配置動態調整中的應用

Java 大視界 -- Java 大數據機器學習模型在金融市場波動預測與資產配置動態調整中的應用引言&#xff1a;正文&#xff1a;一、Java 構建的金融數據處理架構1.1 多源數據實時融合與清洗1.2 跨市場數據關聯&#xff08;風險傳導分析&#xff09;二、Java 驅動的市場波動預測模型…