一、 線程間的同步還有這樣一種情況:線程A需要等某個條件成立才能繼續往下執行,現在這個條件不成立,線程A就阻塞等待,線程B在執行過程中使這個條件成立了,就喚醒線程A繼續執行。在pthread庫中通過條件變量(Condition Variable)來阻塞等待某個條件,或者喚醒等待這個條件的線程。Condition Variablepthread_cond_t類型的變量表,可以這樣初始化和銷燬:
返回值:成功返回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上等待的所有線程。
二、生產者--消費者問題
本例中使用帶頭單鏈表實現生產者消費者之間的場所,使用尾插頭刪的功能。如下爲只有一個消費者,一個生產者。生產者實現插入節點,消費者實現刪除節點。需要條件變量與互斥鎖結合使用。
代碼如下:
其運行結果如下:
改爲多線程:也就是多消費者,多生產者。需要實現,消費者與消費者之間互斥,生產者與生產者之間互斥,消費者與生產者之間互斥。代碼如下:
其運行結果如下:
總結:在互斥的基礎之上實現了同步,不僅解決了死鎖的問題,而且使線程間的通信更加的高效。