C 11多執行緒使用互斥變數

2021-09-11 18:55:29 字數 1705 閱讀 5449

在學習作業系統的時候,有學過互斥變數,也就是用來保護原子數在同一時刻只能被乙個執行緒進行訪問和修改。c++中通過例項化 std::mutex 建立互斥量,通過呼叫成員函式lock()進行上鎖,unlock()進行解鎖。不過,不推薦實踐中直接去呼叫成員函式,因為呼叫成員函式就意味著,必須記住在每個函式出口都要去呼叫unlock(),也包括異常的情況。c++標準庫為互斥量提供了乙個raii語法的模板類 std::lock_guard ,其會在構造的時候提供已鎖的互斥量,並在析構的時候進行解鎖,從而保證了乙個已鎖的互斥量總是會被正確的解鎖

在不加鎖的情況下,主程序main()和子程序t同時共用cout導致很混亂

#include 

#include

#include

#include

using namespace std;

mutex mu;

//互斥變數,全域性變數

可以清楚的看到,加了鎖後,輸出就有序了。但是這樣還存在乙個問題,若在解鎖unlock()之前出現了異常,那就永遠不會解鎖,及cout就永遠不會被釋放,因此一般不使用lock()unlockstd::lock_guard ,其會在構造的時候提供已鎖的互斥量,並在析構的時候進行解鎖,從而保證了乙個已鎖的互斥量總是會被正確的解鎖

加鎖後有序了

std::mutex 和 std::lock_guard都在 標頭檔案中宣告。

mutex必須為全域性變數

若在解鎖unlock()之前出現了異常,則被保護的變數將永遠不會被釋放,因此一般不用lock()unlock()

C 11 多執行緒同步 互斥鎖 條件變數

在多執行緒程式中,執行緒同步 多個執行緒訪問乙個資源保證順序 是乙個非常重要的問題,linux下常見的執行緒同步的方法有下面幾種 這篇部落格只介紹互斥量和條件變數的使用。通常情況下,互斥鎖和條件變數是配合使用的,互斥鎖用於短期鎖定,主要保證執行緒對臨界區的進入 條件變數用於執行緒長期等待,在wait...

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...