C++ —— 線程同步(互斥鎖)

C++ —— 線程同步(互斥鎖)

  • 線程同步
  • 互斥鎖(互斥量)
    • 測試代碼
    • mutex互斥鎖

線程同步

線程同步:多線程協同工作,協商如何使用共享資源。
C++11線程同步包含三部分內容:

  1. 互斥鎖(互斥量)
  2. 條件變量
  3. 生產/消費者模型

互斥鎖(互斥量)

只有加鎖解鎖兩種狀態,確保同一時間只有一個線程訪問共享資源。
訪問共享資源之前加鎖,加鎖成功訪問資源,訪問完成解鎖釋放。
若某線程持有鎖,其他線程形成等待隊列

C++11提供了4種互斥鎖:

  • mutex:互斥鎖(最常用)
  • timed_mutex:帶超時機制的互斥鎖
  • recursive_mutex:遞歸互斥鎖
  • recursive_timed_mutex:帶超時機制的遞歸互斥鎖

測試代碼

#include <iostream>
#include <thread>
using namespace std;void func (int n, const string& s) {for (int i = 1; i <= 10; i++) {cout << "No." << i << ", n = " << n << ", s = " << s << endl;this_thread::sleep_for(chrono::seconds(1));}
}
a
int main () {thread t1(func, 1, "t1");thread t2(func, 2, "t2");thread t3(func, 3, "t3");thread t4(func, 4, "t4");thread t5(func, 5, "t5");thread t6(func, 6, "t6");t1.join();t2.join();t3.join();t4.join();t5.join();t6.join();return 0;
}

cout屬于全局對象,若多線程都用它向屏幕輸出文字,會出亂子。線程越多,越容易亂。

mutex互斥鎖

使用互斥鎖cout加鎖,代碼如下:

#include <iostream>
#include <thread>
#include <mutex> // 使用互斥鎖需要包含的頭文件
using namespace std;mutex mtx; // 創建互斥鎖對象,用于保護共享資源cout對象。void func (int n, const string& s) {for (int i = 1; i <= 10; i++) {// 每次調用cout對象之前,申請加鎖mtx.lock();cout << "No." << i << ", n = " << n << ", s = " << s << endl;// 用完了就解鎖mtx.unlock();this_thread::sleep_for(chrono::seconds(1));}
}int main () {// 代碼不變...
}

再看一段示例代碼:

#include <iostream>
#include <chrono> // 時間相關操作的頭文件
#include <thread> // 線程相關操作的頭文件
#include <mutex> // 互斥鎖的頭文件
using namespace std;int a = 0;
mutex mtx; // 創建互斥鎖對象,用于保護共享資源a變量。void func () {for (int i = 0; i < 1000000; ++i) {mtx.lock();a++;mtx.unlock();}
}int main () {auto start = chrono::steady_clock::now();thread t1(func);thread t2(func);t1.join();t2.join();auto end = chrono::steady_clock::now();cout << "time = " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms" << endl;cout << "a = " << a << endl;return 0;
}

運行結果:

time = 101ms
a = 2000000

在代碼中添加一些打印信息,能更清楚的觀察到:兩個線程申請加鎖,只有一個成功,另外一個線程等待,直到第一個線程解鎖后第二個線程才能加鎖。

#include <iostream>
#include <chrono> // 時間相關操作的頭文件
#include <thread> // 線程相關操作的頭文件
#include <mutex> // 互斥鎖的頭文件
using namespace std;int a = 0;
mutex mtx;void func () {for (int i = 0; i < 1000000; ++i) {cout << "thread id: " << this_thread::get_id() << ", 申請加鎖" << endl;mtx.lock();cout << "thread id: " << this_thread::get_id() << ", 加鎖成功" << endl;a++;this_thread::sleep_for(chrono::seconds(5));mtx.unlock();cout << "thread id: " << this_thread::get_id() << ", 解鎖" << endl;this_thread::sleep_for(chrono::seconds(1));}
}int main () {thread t1(func);thread t2(func);t1.join();t2.join();cout << "a = " << a << endl;return 0;
}

運行結果:

thread id: 139727756003072, 申請加鎖
thread id: 139727756003072, 加鎖成功
thread id: 139727747610368, 申請加鎖
thread id: 139727756003072, 解鎖
thread id: 139727747610368, 加鎖成功
thread id: 139727756003072, 申請加鎖
thread id: 139727747610368, 解鎖

感謝瀏覽

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

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

相關文章

UI設計中的加載動畫:優化用戶體驗的細節

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在數字產品泛濫的今天&#xff0c;用戶對體驗的要求早已超越功能本身。一個看似簡單的加載動畫&…

SpringBoot3+Vue3實戰(Vue3快速開發登錄注冊頁面并對接后端接口)(4)

目錄 一、SpringBoot3Vue3實現基本增刪改查。前后端通信交互、配置后端跨域請求。數據批量刪除。(博客鏈接) 二、SpringBoot3Vue3快速開發登錄、注冊頁面并實現對接。 &#xff08;1&#xff09;操作數據表employee(員工信息表)。 <1>修改employee表的字段組成。 <2&g…

Python標準庫中bisect模塊的bisect_right()函數在網格交易中的應用

本文將深入探討Python標準庫中bisect模塊的bisect_right()函數在網格交易中的具體應用。 bisect模塊 bisect模塊是Python標準庫中的一個模塊&#xff0c;提供了對有序列表的插入和搜索操作的支持。它基于二分查找算法&#xff0c;可以高效地在有序列表中查找或插入元素&#x…

Excel(函數篇):IF函數、FREQUNCY函數、截取函數、文本處理函數、日期函數、常用函數詳解

目錄 IF函數等于判斷區間判斷與AND函數、OR函數一同使用IFNA函數和IFERROR函數 FREQUNCY函數、分斷統計LEFT、RIGHT、MID截取函數FIND函數、LEN函數SUBSTITUTE函數ASC函數、WIDECHAR函數實戰&#xff1a;如何獲取到表中所有工作簿名稱文本處理函數TEXT函數TEXTJOIN函數 日期函數…

生成PDF文件:從html2canvas和jsPdf渲染到Puppeteer矢量圖

剛剛實現而已&#xff1a;第一次明白&#xff0c;雙擊或file:///打開html文件&#xff0c;居然和從localhost:3000打開同一個html文件有本質的區別。 字體居然還能以Base64代碼嵌入到網頁&#xff0c;只是太大太笨。 需要安裝node.js&#xff0c;npm安裝更多依賴&#xff1a;…

Git 分支刪除操作指南(含本地與遠程)

&#x1f680; Git 分支刪除操作指南&#xff08;含本地與遠程&#xff09; 在多人協作的開發過程中&#xff0c;定期清理已合并的臨時分支&#xff08;如 feature/*、bugfix/*、hotfix/* 等&#xff09;可以保持倉庫整潔&#xff0c;避免混亂。 &#x1f4cc; 分支命名規范回…

Qt中打開windows的cmd窗口并顯示

在windows上&#xff0c;用Qt的GUI程序打開另一個程序&#xff0c;使用QProcess即可&#xff0c;并且被打開的程序通常也會顯示出來&#xff0c;但是如果想要打開dos窗口并顯示&#xff0c;并執行其中的命令或者批處理&#xff0c;則需要使用QProcess提供的windows特有的函數QP…

Modbus TCP到RTU:輕松轉換指南!

Modbus TCP 到 RTU&#xff1a;輕松轉換指南&#xff01; 在現代工業自動化領域&#xff0c;Modbus TCP和Modbus RTU兩種通信協議因其高效、穩定的特點被廣泛應用。然而&#xff0c;隨著技術的發展和設備升級的需求&#xff0c;經常會遇到需要將這兩種協議進行互相轉換的場景。…

微信小程序訂閱消息發送消息,點擊消息進入小程序頁面

1、在小程序官網訂閱消息選用或創建消息模板獲取模板ID可多個 如圖&#xff1a; 2、微信小程序前端頁面發送請求訂閱權限 請求模板id的權限可以是一個可以是多個&#xff0c;用戶同意訂閱&#xff0c;獲取code傳遞給后端——后端拿到code生成唯一的openid用于發送訂閱消息 注…

卷積神經網絡 - 卷積層

卷積神經網絡一般由卷積層、匯聚層和全連接層構成&#xff0c;本文我們來學習卷積層。 卷積層&#xff08;Convolutional Layer&#xff09;是卷積神經網絡&#xff08;CNN&#xff09;的核心組件&#xff0c;專門用于處理具有網格結構的數據&#xff08;如圖像、音頻、時間序…

Vue3全局化配置(ConfigProvider)

效果如下圖&#xff1a; 在線預覽 APIs ConfigProvider 參數說明類型默認值theme主題對象Theme{}abstractboolean是否不存在 DOM 包裹元素truetagstringConfigProvider 被渲染成的元素&#xff0c;abstract 為 true 時有效‘div’ Theme Type 名稱說明類型默認值common?全…

LabVIEW煙氣速度場實時監測

本項目針對燃煤電站煙氣流速實時監測需求&#xff0c;探討了靜電傳感器結構與速度場超分辨率重建方法&#xff0c;結合LabVIEW多板卡同步采集與實時處理技術&#xff0c;開發出一個高效的煙氣速度場實時監測系統。該系統能夠在高溫、高塵的復雜工況下穩定運行&#xff0c;提供高…

若依excel工具類導出excel模板數據帶下拉映射

導出模板代碼&#xff0c;原理是combo屬性 傳遞一個數組 里面是label下拉數組。 Overridepublic void downloadTemplate(HttpServletResponse response) {ExcelUtil<ThMachineryManageExcel> util new ExcelUtil<>(ThMachineryManageExcel.class);List<SysDist…

3.8 Spring Boot監控:Actuator+Prometheus+Grafana可視化

在Spring Boot應用中&#xff0c;通過整合Actuator、Prometheus和Grafana可以構建完整的監控體系&#xff0c;實現指標采集、存儲和可視化。以下是具體實現步驟&#xff1a; 一、Spring Boot Actuator 配置 作用&#xff1a;暴露應用健康指標、性能數據等監控端點。 1. 添加依…

啟幕數據結構算法雅航新章,穿梭C++夢幻領域的探索之旅——二叉樹序列構造探秘——堆的奧義與實現詩篇

人無完人&#xff0c;持之以恒&#xff0c;方能見真我&#xff01;&#xff01;&#xff01; 共同進步&#xff01;&#xff01; 文章目錄 一、堆的定義與結構二、堆的實現1.堆的初始化和銷毀堆的初始化堆的銷毀 2.向上調整算法和入堆向上調整算法入堆 3.向下調整算法和出堆頂數…

“Failed to Load SteamUI.dll” 錯誤詳解:全面解析與高效解決方案,助你快速修復 Steam 客戶端問題

在使用 Steam 客戶端時&#xff0c;你是否遇到過 failed to load steamui.dll 錯誤&#xff1f;這個令人頭疼的問題可能導致 Steam 無法正常啟動&#xff0c;影響游戲體驗。Failed to load steamui.dll 錯誤通常與文件損壞、系統配置或軟件沖突有關&#xff0c;但無需擔心&…

STM32 DAC詳解:從原理到實戰輸出正弦波

目錄 一、DAC基礎原理1.1 DAC的作用與特性1.2 DAC功能框圖解析 二、DAC配置步驟2.1 硬件配置2.2 初始化結構體詳解 三、DAC數據輸出與波形生成3.1 數據格式與電壓計算3.2 正弦波生成實戰3.2.1 生成正弦波數組3.2.2 配置DMA傳輸3.2.3 定時器觸發配置 四、常見問題與優化建議4.1 …

CNN 稠密任務經典結構

FCN UNet FPN FCNUNETFPNpadding無&#xff08;逐漸變小&#xff09; 有&#xff08;左右對稱&#xff09;上采樣 雙線性雙線性 最近鄰跳躍鏈接 相加 Cropcat 1x1卷積相加 三個網絡差不多&#xff0c;UNet名字最直觀&#xff0c;后續流傳…

AI學習第二天--監督學習 半監督學習 無監督學習

目錄 1. 監督學習&#xff08;Supervised Learning&#xff09; 比喻&#xff1a; 技術細節&#xff1a; 形象例子&#xff1a; 2. 無監督學習&#xff08;Unsupervised Learning&#xff09; 比喻&#xff1a; 技術細節&#xff1a; 形象例子&#xff1a; 3. 半監督學…

Elasticsearch:為推理端點配置分塊設置

推理端點對一次可處理的文本量有限&#xff0c;具體取決于模型的輸入容量。分塊&#xff08;Chunking&#xff09; 是指將輸入文本拆分成符合這些限制的小塊的過程&#xff0c;在將文檔攝取到 semantic_text 字段時會進行分塊。分塊不僅有助于保持輸入文本在可處理范圍內&#…