在多線程程序中,線程同步(多個線程訪問一個資源保證順序)是一個非常重要的問題,linux
下常見的線程同步的方法有下面幾種:
這篇博客只介紹互斥量和條件變量的使用。
通常情況下,互斥鎖和條件變量是配合使用的,互斥鎖用于短期鎖定,主要保證線程對臨界區的進入;條件變量用于線程長期等待,在wait的時候會釋放鎖。操作的API如下所示(介紹最常用的):
std::mutex
: 獨占的互斥量,不能遞歸使用 std::condition_variable
:條件變量,配合 std::unique<std::mutex>
進行wait操作。 std::condition_variable_any
和任意帶有lock,unlock
的mutex配合使用,但是效率比std::condition_variable
差。
舉個栗子:
10個人排隊使用打印機,任一時刻只有一個人能使用。用一個變量i
的0
和1
兩種狀態分別表示打印機能不能使用。這個程序這樣寫,詳細解釋見注釋:
測試情況應該是:每個進程輸出的i
都為0
,表示每個進程都在合理的使用打印機,沒有出現同時使用的情況,即i < 0
的情況。
$ g++ condition.cpp -pthread //注意鏈接pthread
嗯,可見我們的使用姿勢是正確的~
新聞熱點
疑難解答
圖片精選