Linux下用條件變量實現多線程間生產者與消費者問題

一、 線程間的同步還有這樣一種情況:線程A需要等某個條件成立才能繼續往下執行,現在這個條件不成立,線程A就阻塞等待,線程B在執行過程中使這個條件成立了,就喚醒線程A繼續執行。在pthread庫中通過條件變量(Condition Variable)來阻塞等待某個條件,或者喚醒等待這個條件的線程。Condition Variablepthread_cond_t類型的變量表,可以這樣初始化和銷燬:

wKioL1cYeM2whfMMAAA72IoCNxU075.jpg

返回值:成功返回0,失敗返回錯誤號。

一個Condition Variable總是和一個Mutex搭配使用的。一個線程可以調用pthread_cond_wait在一個Condition Variable上阻塞等待,這個函數做以下三步操作: 

1. 釋放Mutex

2. 阻塞等待

3. 當被喚醒時,重新獲得Mutex並返回  

pthread_cond_timedwait函數還有一個額外的參數可以設定等待超時,如果到達了abstime所指定的時刻仍然沒有別的線程來喚醒當前線程,就返回ETIMEDOUT。一個線程可以調用pthread_cond_signal喚醒在某個Condition Variable上等待的另一個線程,也可以調用pthread_cond_broadcast喚醒在這Condition Variable上等待的所有線程。

二、生產者--消費者問題

本例中使用帶頭單鏈表實現生產者消費者之間的場所,使用尾插頭刪的功能。如下爲只有一個消費者,一個生產者。生產者實現插入節點,消費者實現刪除節點。需要條件變量與互斥鎖結合使用。

代碼如下:

wKioL1caJZrQ_xzkAACbnOPzC84976.jpg

wKiom1caJNbQzwzHAABd9D0dHUk208.jpg

wKioL1caJZuhWIvrAAB_IVVwB9g464.jpg

wKioL1caJZvy2D49AACHd9WXrcM095.jpg

其運行結果如下:

wKiom1caJNiDW_UxAABSiMokI-c199.jpg

改爲多線程:也就是多消費者,多生產者。需要實現,消費者與消費者之間互斥,生產者與生產者之間互斥,消費者與生產者之間互斥。代碼如下:

wKiom1caJTzxUNSOAABcYA2Qpx0341.jpg

wKioL1caJgDDbv8NAABk4WxoxKA323.jpg

其運行結果如下:

wKiom1caJTzB1_NLAABW9RWHLp4954.jpg

總結:在互斥的基礎之上實現了同步,不僅解決了死鎖的問題,而且使線程間的通信更加的高效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章