c++ 線程安全與線程管理

C++11引入了標準庫中的多線程支持,包括std::thread類和各種同步機制

  • 互斥鎖std::mutex : 互斥鎖用于保護共享資源,確保同一時間只有一個線程能夠訪問該資源,以防止數據競爭。

  • 條件變量std::condition_variable : 條件變量用于線程之間的通信,允許一個或多個線程等待某個條件(或者事件)的發生,而另一個線程則可以通知這些等待的線程該條件已經滿足。

  • 原子操作std::atomic : 原子操作用于無鎖編程,提供對基本數據類型的原子讀寫操作,防止數據競爭而無需顯式的鎖機制。

  • 信號量(Semaphore):用于控制對共享資源的訪問,可以實現多個線程之間的同步和互斥。

  • 讀寫鎖(Reader-Writer Lock):用于實現讀寫線程對共享數據的訪問控制,允許多個讀線程同時進行讀操作,但只允許一個寫線程進行寫操作。

  • 屏障(Barrier):用于保證多個線程在某個點上同步,只有當所有線程都達到屏障點時才能繼續執行。

  • 事件(Event):用于實現線程間的通信和同步,一個線程等待某個事件的發生,而另一個線程觸發該事件。

  • 互斥量遞歸鎖(Recursive Mutex):與互斥鎖類似,但允許同一個線程多次獲得同一個鎖,避免死鎖。

  • 讀寫互斥量(Read-Write Mutex):類似于讀寫鎖,但使用互斥量來實現,可以更靈活地控制讀寫線程對共享數據的訪問。

創建和管理線程

#include <iostream>
#include <thread>void printMessage(const std::string& message) {std::cout << message << std::endl;
}int main() {std::thread t1(printMessage, "Hello from thread 1");std::thread t2(printMessage, "Hello from thread 2");// 等待線程結束t1.join();t2.join();return 0;
}

使用互斥鎖進行同步

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

使用條件變量進行線程間通信

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void printMessage() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return ready; });std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(printMessage);{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();t.join();return 0;
}

信號量(Semaphore):

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <semaphore.h>sem_t semaphore;void worker() {sem_wait(&semaphore); // 等待信號量std::cout << "執行任務" << std::endl;
}int main() {sem_init(&semaphore, 0, 0); // 初始化信號量為0std::thread t(worker);// 模擬一些操作std::this_thread::sleep_for(std::chrono::seconds(2));sem_post(&semaphore); // 發送信號量t.join();sem_destroy(&semaphore);return 0;
}

讀寫鎖(Reader-Writer Lock):

#include

#include <thread>
#include <shared_mutex>std::shared_mutex rwMutex;
int data = 0;void reader() {std::shared_lock<std::shared_mutex> lock(rwMutex);std::cout << "讀取數據:" << data << std::endl;
}void writer() {std::unique_lock<std::shared_mutex> lock(rwMutex);data++;std::cout << "寫入數據:" << data << std::endl;
}int main() {std::thread readerThread1(reader);std::thread readerThread2(reader);std::thread writerThread(writer);readerThread1.join();readerThread2.join();writerThread.join();return 0;
}

屏障(Barrier):

#include <iostream>
#include <thread>
#include <barrier>std::barrier myBarrier(3); // 創建一個屏障,需要三個線程都到達后才能繼續執行void worker() {// 模擬一些操作std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "執行任務" << std::endl;myBarrier.arrive_and_wait(); // 到達屏障并等待std::cout << "任務完成" << std::endl;
}int main() {std::thread t1(worker);std::thread t2(worker);std::thread t3(worker);t1.join();t2.join();t3.join();return 0;
}

事件(Event)

事件可以用于實現線程間的通信和同步,一個線程等待某個事件的發生,而另一個線程觸發該事件。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool eventOccurred = false;void waitForEvent() {std::unique_lock<std::mutex> lock(mtx);while (!eventOccurred) {cv.wait(lock);}std::cout << "事件已發生,執行任務" << std::endl;
}void triggerEvent() {{std::lock_guard<std::mutex> lock(mtx);eventOccurred = true;}cv.notify_one();std::cout << "事件已觸發" << std::endl;
}int main() {std::thread t1(waitForEvent);std::this_thread::sleep_for(std::chrono::seconds(2));std::thread t2(triggerEvent);t1.join();t2.join();return 0;
}

互斥量遞歸鎖(Recursive Mutex)

互斥量遞歸鎖允許同一個線程多次獲得同一個鎖,避免了死鎖。

#include <iostream>
#include <thread>
#include <mutex>std::recursive_mutex mtx;void recursiveFunction(int depth) {std::lock_guard<std::recursive_mutex> lock(mtx);if (depth > 0) {std::cout << "遞歸深度:" << depth << std::endl;recursiveFunction(depth - 1);}
}int main() {recursiveFunction(3);return 0;
}

讀寫互斥量(Read-Write Mutex)

讀寫互斥量使用互斥量來實現,可以更靈活地控制讀寫線程對共享數據的訪問。

#include <iostream>
#include <thread>
#include <mutex>std::mutex readMutex;
std::mutex writeMutex;
int data = 0;void reader() {std::lock_guard<std::mutex> lock(readMutex);std::cout << "讀取數據:" << data << std::endl;
}void writer() {std::lock_guard<std::mutex> lock(writeMutex);data++;std::cout << "寫入數據:" << data << std::endl;
}int main() {std::thread readerThread1(reader);std::thread readerThread2(reader);std::thread writerThread(writer);readerThread1.join();readerThread2.join();writerThread.join();return 0;
}

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

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

相關文章

埃特巴什碼加解密小程序

埃特巴什碼加解密小程序 這幾天在看CTF相關的課程&#xff0c;涉及到古典密碼學和近代密碼學還有現代密碼學。 簡單替換密碼 Atbash Cipher 埃特巴什碼(Atbash Cipher)其實可以視為下面要介紹的簡單替換密碼的特例&#xff0c;它使用字母表中的最后 一個字母代表第一個字母…

springboot學習01-[springboot介紹、配置文件介紹、自動配置讀取原理]

springboot介紹、配置文件介紹、自動配置讀取原理 springBoot學習代碼說明為什么java -jar springJar包后項目就可以啟動 配置文件介紹配置文件加載順序其他約定配置文件加載順序profile配置文件加載配置文件綁定類屬性通過Value的方式進行屬性注入通過ConfigurationProperties…

力扣62 不同路徑

一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff1f; 輸入&…

【LC刷題】DAY16:530 501 236

【LC刷題】DAY16&#xff1a;530 501 236 文章目錄 【LC刷題】DAY16&#xff1a;530 501 236530. 二叉搜索樹的最小絕對差 [link](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/)501.二叉搜索樹中的眾數236. 二叉樹的最近公共祖先 [link](htt…

壓縮文件夾的時候 找不到該文件或您沒有讀取該文件的權限。

在壓縮文件夾時&#xff0c;出現 “找不到該文件或您沒有讀取該文件的權限” 錯誤&#xff0c;可能有以下幾種原因和解決方法&#xff1a; 1. 文件不存在或路徑錯誤 檢查文件路徑&#xff1a;確保文件路徑正確且文件確實存在。 文件名和路徑長度&#xff1a;Windows 對文件路…

FedCache 2.0引領聯邦邊緣學習性能與通信效率革新

FedCache 2.0引領聯邦邊緣學習性能與通信效率革新 在今天的數字化時代&#xff0c;邊緣計算正迅速成為推動終端設備智能化的核心技術之一&#xff1b;如何在保證數據隱私的同時提高數據在網絡邊緣的處理效率和效果&#xff0c;已成為業界面臨的一大挑戰。最近&#xff0c;《Fe…

二分類問題中的性能指標【python,機器學習,算法】

平均絕對誤差&#xff08;MAE&#xff09; 平均絕對誤差&#xff08;Mean Absolute Error, MAE&#xff09;是衡量模型預測誤差的一種方法&#xff0c;通常用于回歸分析。它表示的是預測值與真實值之間差的絕對值的平均數。計算公式如下&#xff1a; M A E 1 N ∑ i 1 N ∣…

MacOS 上安裝和管理 Node.js

在 macOS 上安裝和管理 Node.js&#xff0c;使用 Node Version Manager (NVM) 是一種簡便且高效的方法。NVM 允許您輕松地安裝、切換和管理不同版本的 Node.js。本指南將帶您一步步完成這一過程。 步驟 1&#xff1a;安裝 Node Version Manager (NVM) 首先&#xff0c;我們需…

電巢科技CIOE中國光博會:激光雷達技術應用研討會圓滿落幕!

2024年6月20日&#xff0c;由CIOE中國光博會與電巢科技聯合主辦的“激光雷達技術應用”線上研討會成功舉行。本次線上研討會是CIOE中國光博會與電巢科技首次聯合主辦的論壇&#xff0c;旨在借助雙方自身資源優勢&#xff0c;為行業發展提供可靠的交流平臺。接下來&#xff0c;C…

Android焦點機制結合WMS

文章前提&#xff1a; 了解WMS基本作用了解window的概念&#xff0c;phoneWindow&#xff0c;rootViewImpl了解view的事件分發 開始&#xff1a; 講三件事情&#xff1a; window的創建&#xff0c;更新焦點的更新事件的分發 Window的創建&#xff0c;更新&#xff1a; wi…

基于 Redis 實現秒殺資格判斷,提升并發性能

在互聯網電商平臺上&#xff0c;秒殺活動往往會吸引大量用戶同時搶購&#xff0c;如何高效地處理高并發請求&#xff0c;保證用戶體驗&#xff0c;是一個重要的技術挑戰。本文將介紹如何基于 Redis 實現秒殺資格的判斷&#xff0c;提高并發性能。 基本思路 秒殺活動的核心流程…

AI 編程還有前景嘛?

自從各個大廠相繼出品 AI 編程助手之后&#xff0c;AI 在編程領域的發展&#xff0c;可謂是幾無寸進。 相比于 AI 在多模態領域火熱&#xff0c;AI 在編程領域的熱度已經完全下來了。 阿七在公眾號搜索了關鍵詞「AI編程」&#xff0c;發現搜索出來的公眾號寥寥無幾&#xff0…

LLM生成模型在生物蛋白質應用:ESM3

參考&#xff1a; https://github.com/evolutionaryscale/esm 通過GPT模型原理&#xff0c;輸入蛋白質序列等模態輸出預測的蛋白質序列及結構 使用 參考&#xff1a;https://colab.research.google.com/github/evolutionaryscale/esm/blob/main/examples/generate.ipynb#sc…

(六)使用統計學方法進行變量有效性測試(43道選擇題)

本文整理了使用統計學方法進行變量有效性測試相關的練習題&#xff0c;共43道&#xff0c;適用于想鞏固理論基礎的同學。來源&#xff1a;如荷學數據科學題庫&#xff08;CDA二級-第7章&#xff09;。 1&#xff09; 2&#xff09; 3&#xff09; 4&#xff09; 5&#xff09;…

【無人機三維路徑規劃】基于樹木生長算法TGA實現復雜城市地形下無人機避障三維航跡規劃附Matlab代碼

% 定義無人機起始位置和目標位置 start_point [0, 0, 0]; % 起始位置 [x, y, z] target_point [100, 100, 100]; % 目標位置 [x, y, z] % 定義城市地形和障礙物信息 city_map imread(‘city_map.png’); % 城市地形圖像 obstacles [ 20, 30, 10; % 障礙物1位置 [x, y, z] …

三分之一的違規行為未被發現

Gigamon 調查顯示&#xff0c;隨著漏洞的針對性越來越強、越來越復雜&#xff0c;企業在檢測漏洞方面也面臨越來越大的困難&#xff0c;超過三分之一的企業表示&#xff0c;現有的安全工具無法在漏洞發生時檢測到它們。 隨著混合云環境變得越來越復雜&#xff0c;以及惡意行為…

Java 語言特定指南

Java 語言特定指南 本 Java 入門指南將教您如何使用 Docker 創建一個容器化的 Spring Boot 應用程序。在本模塊中&#xff0c;您將學習如何&#xff1a; 使用 Maven 容器化并運行一個 Spring Boot 應用程序設置本地開發環境以將數據庫連接到容器、配置調試器&#xff0c;并使…

篩斗數據:引領未來,以技術創新推動在線推廣新紀元

在數字化浪潮的推動下&#xff0c;企業在線推廣已成為市場拓展的關鍵手段。然而&#xff0c;在海量信息中精準定位目標用戶&#xff0c;有效提升轉化率&#xff0c;卻是一大挑戰。篩斗數據&#xff0c;作為一家專注于數據提取與分析的技術公司&#xff0c;正以其獨特的技術優勢…

云計算基礎知識

前言&#xff1a; 隨著ICT技術的高速發展&#xff0c;企業架構對計算、存儲、網絡資源的需求更高&#xff0c;急需一種新的架構來承載業務&#xff0c;以獲得持續&#xff0c;高速&#xff0c;高效的發展&#xff0c;云計算應運而生。 云計算背景 信息大爆炸時代&#xff1a…

Linux 標準IO的fopen和fclose

getchar(),putchar() ‐‐‐‐ 一個字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一個字符&#xff0c;一串字符都可以 fopen函數的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打開一個文件 * param ‐ path…