在多執行緒程式中,執行緒同步(多個執行緒訪問乙個資源保證順序)是乙個非常重要的問題,linux
下常見的執行緒同步的方法有下面幾種:
這篇部落格只介紹互斥量和條件變數的使用。
通常情況下,互斥鎖和條件變數是配合使用的,互斥鎖用於短期鎖定,主要保證執行緒對臨界區的進入;條件變數用於執行緒長期等待,在wait的時候會釋放鎖。操作的api如下所示(介紹最常用的):
舉個栗子:std::mutex
: 獨佔的互斥量,不能遞迴使用
std::condition_variable
:條件變數,配合std::unique
進行wait操作。
std::condition_variable_any
和任意帶有lock,unlock
的mutex配合使用,但是效率比std::condition_variable
差。
10個人排隊使用印表機,任一時刻只有乙個人能使用。用乙個變數i
的0
和1
兩種狀態分別表示印表機能不能使用。這個程式這樣寫,詳細解釋見注釋:
#include#include#include#includestd::vectortv; //儲存執行緒的情況
std::condition_variable_any m_t; //條件變數
std::mutex lock; //互斥鎖
int i = 1; //印表機資源 初始為1 表示可用
void subi()
i--; //使用印表機過程
}void addi()
void func(int j)
int main(int argc,char *ar**)
for(auto &thread : tv)
return 0;
}
測試情況應該是:每個程序輸出的i
都為0
,表示每個程序都在合理的使用印表機,沒有出現同時使用的情況,即i < 0
的情況。
$ g++ condition.cpp -pthread //注意鏈結pthread嗯,可見我們的使用姿勢是正確的~
執行緒同步 互斥鎖 條件變數
在 執行緒同步 互斥鎖 一文中,我們分析了只用互斥鎖同步執行緒的弊端 cpu的效率和時效性不可兼得。下面,我們通過使用條件變數,在保證cpu效率的前提下,提高程式的時效性。只用互斥鎖同步執行緒,其cpu佔用率之所以高,是因為執行緒需要輪詢,即需要不停的檢查條件是否滿足。我們使用條件變數,當條件不滿足...
C 11多執行緒使用互斥變數
在學習作業系統的時候,有學過互斥變數,也就是用來保護原子數在同一時刻只能被乙個執行緒進行訪問和修改。c 中通過例項化 std mutex 建立互斥量,通過呼叫成員函式lock 進行上鎖,unlock 進行解鎖。不過,不推薦實踐中直接去呼叫成員函式,因為呼叫成員函式就意味著,必須記住在每個函式出口都要...
c 11 多執行緒程式設計 三 競爭條件與互斥鎖
併發 中最常見的錯誤之一就是競爭條件 race condition 而其中最常見的就是資料競爭 data race 從整體上來看,所有執行緒之間共享資料的問題,都是修改資料導致的,如果所有的共享資料都是唯讀的,就不會發生問題。但是這是不可能的,大部分共享資料都是要被修改的。而c 中常見的cout就是...