C++ 互斥量

在 C++ 中,互斥量(std::mutex)是一種用于多線程編程中保護共享資源的機制,防止多個線程同時訪問某個資源,從而避免數據競爭(data race)和不一致的問題。


🔒 一、基礎用法:std::mutex

頭文件:#include <mutex>

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx; // 創建一個互斥量
int counter = 0;void increment(int id) {for (int i = 0; i < 10000; ++i) {mtx.lock();       // 加鎖++counter;        // 訪問共享資源mtx.unlock();     // 解鎖}
}

你可以通過多個線程調用 increment(),互斥量保證了線程安全。


? 更推薦的方式:使用 std::lock_guard

它是一種 RAII(資源獲取即初始化) 的封裝類,作用域結束時會自動解鎖,非常安全,防止漏解鎖。

void increment(int id) {for (int i = 0; i < 10000; ++i) {std::lock_guard<std::mutex> lock(mtx);++counter;} // 作用域結束時自動釋放鎖
}

? 錯誤示例(不要這樣做):

mtx.lock();
++counter;
// 如果中間拋異常,mutex 可能永遠不會 unlock

🧠 其他互斥量類型

類型說明
std::mutex最基本的互斥量
std::recursive_mutex支持同一線程多次加鎖
std::timed_mutex支持帶超時的鎖操作
std::shared_mutexC++17,引入讀寫鎖(多個讀一個寫)

🧪 示例:多個線程安全地寫輸出

#include <iostream>
#include <thread>
#include <mutex>std::mutex print_mtx;void safe_print(const std::string& msg) {std::lock_guard<std::mutex> lock(print_mtx);std::cout << msg << std::endl;
}int main() {std::thread t1(safe_print, "hello from thread 1");std::thread t2(safe_print, "hello from thread 2");t1.join();t2.join();return 0;
}

? try_lock()timed_mutex

if (mtx.try_lock()) {// 成功獲得鎖mtx.unlock();
} else {// 沒拿到鎖,干別的事
}
std::timed_mutex tmtx;
if (tmtx.try_lock_for(std::chrono::milliseconds(100))) {// 拿到鎖tmtx.unlock();
}

總結:

方法是否推薦用法說明
mutex.lock()/unlock()? 不推薦(容易忘記 unlock)
std::lock_guard? 推薦,簡單安全
std::unique_lock? 推薦,需要更靈活控制時
try_lock / timed_mutex? 用于嘗試加鎖或有時間要求

如你需要我幫你寫一個完整的多線程例子(比如生產者-消費者模型、線程池、文件讀寫等),可以直接告訴我場景!

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

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

相關文章

CSS Content符號編碼大全

資源寶整理分享&#xff1a;?https://www.httple.net? 前端開發中常用的特殊符號查詢工具&#xff0c;包含Unicode編碼和HTML實體編碼&#xff0c;方便開發者快速查找和使用各種符號。支持基本形狀、箭頭、數學符號、貨幣符號等多種分類。 前端最常用符號 圖標形狀十進制十…

RPC常見問題回答

項目流程和架構設計 1.服務端的功能&#xff1a; 1.提供rpc調用對應的函數 2.完成服務注冊 服務發現 上線/下線通知 3.提供主題的操作 (創建/刪除/訂閱/取消訂閱) 消息的發布 2.服務的模塊劃分 1.網絡通信模塊 net 底層套用的moude庫 2.應用層通信協議模塊 1.序列化 反序列化數…

【JavaEE】(3) 多線程2

一、常見的鎖策略 1、樂觀鎖和悲觀鎖 悲觀鎖&#xff1a;預測鎖沖突的概率較高。在鎖中加阻塞操作。樂觀鎖&#xff1a;預測鎖沖突的概率較低。使用忙等/版本號等&#xff0c;不產生阻塞。 2、輕量級鎖和重量級鎖 重量級鎖&#xff1a;加鎖的開銷較大&#xff0c;線程等待鎖…

創客匠人服務體系解析:知識 IP 變現的全鏈路賦能模型

在知識服務行業深度轉型期&#xff0c;創客匠人通過 “工具 陪跑 圈層” 的三維服務體系&#xff0c;構建了從 IP 定位到商業變現的完整賦能鏈條。這套經過 5 萬 知識博主驗證的模型&#xff0c;不僅解決了 “內容生產 - 流量獲取 - 用戶轉化” 的實操難題&#xff0c;更推動…

國產ARM/RISCV與OpenHarmony物聯網項目(六)SF1節點開發

一、終端節點功能設計 1. 功能說明 終端節點設計的是基于鴻蒙操作系統的 TCP 服務器程序&#xff0c;用于監測空氣質量并提供遠程控制功能。與之前的光照監測程序相比&#xff0c;這個程序使用 E53_SF1 模塊&#xff08;煙霧 / 氣體傳感器&#xff09;&#xff0c;主要功能包…

Plotly圖表全面使用指南 -- Displaying Figures in Python

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 在 Python 中顯示圖形 使用 Plotly 的 Python 圖形庫顯示圖形。 顯示圖形 Plotly的Python圖形庫plotly.py提供了多種顯示圖形的選項和方法…

getx用法詳細解析以及注意事項

源碼地址 在 Flutter 中&#xff0c;Get 是來自 get 包的一個輕量級、功能強大的狀態管理與路由框架&#xff0c;常用于&#xff1a; 狀態管理路由管理依賴注入&#xff08;DI&#xff09;Snackbar / Dialog / BottomSheet 管理本地化&#xff08;多語言&#xff09; 下面是 …

深度學習:人工神經網絡基礎概念

本文目錄&#xff1a; 一、什么是神經網絡二、如何構建神經網絡三、神經網絡內部狀態值和激活值 一、什么是神經網絡 人工神經網絡&#xff08;Artificial Neural Network&#xff0c; 簡寫為ANN&#xff09;也簡稱為神經網絡&#xff08;NN&#xff09;&#xff0c;是一種模仿…

Unity2D 街機風太空射擊游戲 學習記錄 #12環射道具的引入

概述 這是一款基于Unity引擎開發的2D街機風太空射擊游戲&#xff0c;筆者并不是游戲開發人&#xff0c;作者是siki學院的涼鞋老師。 筆者只是學習項目&#xff0c;記錄學習&#xff0c;同時也想幫助他人更好的學習這個項目 作者會記錄學習這一期用到的知識&#xff0c;和一些…

網站如何啟用HTTPS訪問?本地內網部署的https網站怎么在外網打開?

在互聯網的世界里&#xff0c;數據安全已經成為了每個網站和用戶都不得不面對的問題。近期&#xff0c;網絡信息泄露事件頻發&#xff0c;讓越來越多的網站開始重視起用戶數據的安全性&#xff0c;因此啟用HTTPS訪問成為了一個熱門話題。作為一名網絡安全專家&#xff0c;我希望…

計算機網絡-----詳解網絡原理TCP/IP(上)

文章目錄 &#x1f4d5;1. UDP協議??1.1 UDP的特點??1.2 基于UDP的應用層協議 &#x1f4d5;2. TCP協議??2.1 TCP協議段格式??2.2 TCP協議特點之確認應答??2.3 TCP協議特點之超時重傳??2.4 TCP協議特點之連接管理??2.5 TCP協議特點之滑動窗口??2.6 TCP協議特點…

Lora訓練

一種大模型高效訓練方式&#xff08;PEFT&#xff09; 目標&#xff1a; 訓練有限的ΔW&#xff08;權重更新矩陣&#xff09; ΔW為低秩矩陣→ΔWAB&#xff08;其中A的大小為dr, B的大小為rk&#xff0c;且r<<min(d,k)&#xff09;→ 原本要更新的dk參數量大幅度縮減…

藍牙 5.0 新特性全解析:傳輸距離與速度提升的底層邏輯(面試寶典版)

藍牙技術自 1994 年誕生以來,已經經歷了多次重大升級。作為當前主流的無線通信標準之一,藍牙 5.0 在 2016 年發布后,憑借其顯著的性能提升成為了物聯網(IoT)、智能家居、可穿戴設備等領域的核心技術。本文將深入解析藍牙 5.0 在傳輸距離和速度上的底層技術邏輯,并結合面試…

Minio使用https自簽證書

自簽證書參考&#xff1a;window和ubuntu自簽證書_windows 自簽證書-CSDN博客 // certFilePath: 直接放在 resources 目錄下 或者可以自定實現讀取邏輯 // 讀取的是 .crt 證書文件public static OkHttpClient createTrustingOkHttpClient(String certFilePath) throws Excep…

汽車前縱梁焊接總成與沖壓件的高效自動化三維檢測方案

汽車主體結構件上存在很多安裝位&#xff0c;為保證汽車裝配時的準確性&#xff0c;主體結構件需要進行全方位的尺寸和孔位置精度檢測&#xff0c;以確保裝配線的主體結構件質量合格。 前縱梁焊接總成是車身框架的核心承載部件&#xff0c;焊接總成由多片鈑金沖壓件焊接組成&a…

F接口基礎.go

前言&#xff1a;接口是一組方法的集合&#xff0c;它定義了一個類型應該具備哪些行為&#xff0c;但不關心具體怎么實現這些行為。一個類型只要實現了接口中定義的所有方法&#xff0c;那么它就實現了這個接口。這種實現是隱式的&#xff0c;不需要顯式聲明。 目錄 接口的定…

cartographer官方指導文件說明---第3章 cartographer前端算法流程介紹

cartographer官方指導文件說明 第3章 cartographer前端算法流程介紹 3.1 Scan Match掃描匹配 掃描匹配&#xff08;Scan Matching&#xff09;是 Cartographer 中實現局部SLAM的核心技術&#xff0c;它通過優化算法將當前激光掃描數據對齊到子圖地圖中。下面從計算過程、數學…

汽車整車廠如何用數字孿生系統打造“透明車間”

隨著工業4.0時代的發展&#xff0c;數字孿生技術已成為現代制造業的重要利器。特別是在汽車整車廠&#xff0c;通過數字孿生系統的應用&#xff0c;能夠有效打造一個“透明車間”&#xff0c;實現生產過程的全面可視化與實時監控&#xff0c;提高生產效率&#xff0c;降低成本&…

openKylin適配RISC-V高性能服務器芯片,攜手睿思芯科共拓智算新藍海

3月31日&#xff0c;睿思芯科&#xff08;深圳&#xff09;技術有限公司&#xff08;簡稱“睿思芯科”&#xff09;2025春季新品發布會在深圳前海國際會議中心盛大舉行&#xff0c;作為RISC-V領域的年度盛事&#xff0c;此次發布會吸引了眾多業內目光。此次發布會上&#xff0c…

【已解決】lxml.etree.ParserError: Document is empty

本專欄解決日常生活工作中非快速找到解決方案的問題。 問題背景 在爬取某網站時&#xff0c;使用開源框架報錯&#xff1a;lxml.etree.ParserError: Document is empty 解決方案 1、多個搜索引擎中查找&#xff0c;建議都是對lxml的python源碼進行修改&#xff0c;不好用。…