boost條件變數使用

2021-07-28 16:35:44 字數 2999 閱讀 9100

條件變數和互斥變數都是boost庫中被封裝的類。

條件變數是thread庫提供的一種等待執行緒同步的機制,可實現執行緒間的通訊,它必須與互斥量配合使用,等待另乙個執行緒中某個事件發生後本執行緒才能繼續執行。

互斥量是一種用於多執行緒程式設計的手段,它可以在多執行緒程式設計中防止多個執行緒同時操作共享資源[

或稱為臨界區]。思想為:在每個執行緒開始的第一條語句使用獲取互斥變數「鎖有權」的語句,一旦乙個執行緒[執行緒1]鎖住了互斥量,那麼其它執行緒只有等待執行緒1解鎖互斥量後且另一線程[執行緒2]又獲取到互斥變數的「鎖有權」後才能執行這個執行緒[執行緒2]後面的**

[1]互斥變數的使用讓執行緒整個整個的執行。

[2]如果「同時」建立多執行緒,則首先獲取到互斥變數「鎖有權」的執行緒是不定的。

有時候我們需要先執行某個執行緒一會兒後才能執行另乙個執行緒,或者是需要先執行某個執行緒[執行緒1]一會兒後必須執行另乙個執行緒[執行緒2]後執行緒1才能夠繼續執行。c++ boost庫對條件變數的封裝 就是來解決這些問題的。

c++boost 的thread庫提供兩種條件變數物件condition_variable及condition_variable_any,由於後者能夠適用於更廣泛的互斥量型別,所以一般用condition_variable_any,其類摘要如下:

class condition_variable_any

條件變數condition_variable_any中只封裝了]notify_one(),notify_all()和wait()系列兩類函式。

擁有條件變數的執行緒先鎖定互斥量,然後迴圈檢查某個條件,如果條件不滿足,那麼就呼叫成員函式wait()等至條件滿足。而其它執行緒處理條件變數要求的條件,當條件滿足時呼叫它的成員函式notify_one()或notify_all(),以通知所有正在等待條件變數的執行緒停止等待繼續執行。

其實這一小段話就將condition_variable_any類摘要的使用機制給描述了,但是不得不承認我並沒有讀懂,所以還得繼續寫程式

驗證一下條件變數到底封裝了怎麼乙個機制。

[1]定義生存期和作用域能夠應用於多執行緒中的條件變數物件和互斥變數物件。條件變數物件的個資料程式需求制定。

condition_variable_any  con_var_1;

condition  variable_anu  con_var_2;

mutex  mu;

[2]每個執行緒對應函式的第一條語句使用鎖定互斥量的語句,最後一條語句使用解鎖互斥量的語句。【如果不使用條件變數來實現執行緒通訊,則如此就能夠使多執行緒中單個執行緒乙個接連乙個的執行,執行時間和場合的不同,各執行緒執行的順序也不同】

void  thread_fun_1()

void  thread_fun_2()

[3]thread_fun_1()輸出」123456789」字串的奇數數字,thread_fun_2()輸出字串的偶數數字,並且用條件變數和多執行緒來實現

void  thread_fun_1( const  string  &str )

if  ( i < str.length() )

++i;

//i++後一定是奇數,但是如果是此執行緒先執行,則第一次通知print_2.wait()時它都不曾等待過

con_var_2.notify_one();

} mu.unlock(); }

void  thread_fun_2( const  string  &str )

if  ( i < str.length() )

++i;

//i++後一定是奇數,但是如果是此執行緒先執行,則第一次通知print_2.wait()時它都不曾等待過

con_var_1.notify_one();

} mu.unlock(); }

其中i可以是兩個執行緒函式都能夠訪問的全域性變數。

[4]在主程式中建立兩個執行緒來跑這兩個執行緒函式。

thread  th_1(thread_fun_1, 「123456789」);

thread  th_2(thread_fun_2, 」123456789」);

可以使用getchar()函式讓執行視窗停留,程式執行效果為目標期待的樣子【前提是知道boost庫的使用需要包含的標頭檔案及開發環境的配置】:

figure1:條件變數應用於多執行緒執行結果

當不懂得乙個程式執行的結果時,那就老老實實從最基本的機制用自己的腦袋將有必要的那部分程式執行一遍。我的笨方法。

其實這個機制在程式執行分析時已經完全的體現了。不過看起來挺長的樣子,語言描述也不流暢。估計我今後也懶得看,還是整理乙個比較簡潔的版本來概括一下條件變數使用的機理。

總而言之,條件變數是一種邏輯控制,就是給咱提供了兩個函式:wait函式用於發出訊號並等待[還有unlock/lock機制],notify_one就是通知wait函式不用等了醒來返回吧。當在每個執行緒中都使用條件變數提供的這種機制時,邏輯上就比較複雜了,但是對於cpu來說很好分清,只要根據執行結果不斷的除錯,總會調到自己期望的邏輯效果。

如果在程式中建立了多個執行緒,不使用互斥變數來約束各執行緒的執行順序,那麼當某個執行緒被定義時它就開始執行,在多執行緒的情況下,各執行緒以極短的時間交替執行著,可以認為在「同一時間」他們都在執行。

對於使用相同互斥變數的多個執行緒來說,只有獲取到互斥量「鎖有權」的執行緒才能執行,否則就會被阻塞直到獲取到了互斥量的「鎖有權」。所以,執行緒是被整個整個依次執行完畢的。而且很有可能是這樣:不同時間的執行對應著不同次序的執行,獲取互斥變數的順序不同造成的。

在互斥變數的基礎之上,使用條件變數就是能實現標題的內容。執行緒既不是「同時」執行也不是會因為執行環境的不同而造成各執行緒執行順序的不同。

(1)~(3)是循序漸進的乙個過程。

boost庫 條件變數

條件變數和互斥變數都是boost庫中被封裝的類。條件變數是thread庫提供的一種等待執行緒同步的機制,可實現執行緒間的通訊,它必須與互斥量配合使用,等待另乙個執行緒中某個事件發生後本執行緒才能繼續執行。互斥量是一種用於多執行緒程式設計的手段,它可以在多執行緒程式設計中防止多個執行緒同時操作共享資源...

使用boost條件變數實現寫優先的讀

測試發現,boost thread庫實現的讀寫鎖是讀優先的 這一點我現在也不確定了,發現讀寫鎖與執行平台關係太大了,windows 或linux,amd還是intel,常常導致測試結果大相徑庭 所以當讀執行緒多的時候,幾乎無法獲取寫鎖。大部分時候,寫優先也許更符合應用的需求。我參考網上 使用boos...

條件變數pthread cond t使用示例

示例 cpp view plain copy include include include pthread mutex t mutex pthread mutex initializer 初始化互斥鎖 pthread cond t cond pthread cond initializer 初始化...