Pthreads條件變量

    條件變量的定義:條件變量是一個數據對象,容許線程在某個特定條件或事件發生前都處於掛起狀態。所以在Pthreads程序中至少有兩個對象,一個在條件知足或事件發生時發送信號,另外一個等待信號。發送對象的操做流程一般以下:(1)對互斥量上鎖;(2)操做謂詞;(3)發送信號;(4)解鎖互斥量。等待對象的操做流程一般爲:(1)對互斥量上鎖;(2)等待信號;(3)進行操做;(4)解鎖互斥量。 函數

注意三個問題: 線程


while(data.flag == false) //檢查謂詞爲假
{
    while(pthread_cond_wait(&data.cond, &data.mutex) != 0); //等待
}
if(data.flag) //檢查謂詞爲真  
    do_something();
(1)被攔截的喚醒:等待對象在等待信號前應該檢測謂詞,若是謂詞已經爲真,則不須要等待,直接操做。

(2)假喚醒:因爲其餘某些事件也可能把掛起的線程解鎖,爲了確保線程是由於cond信號到達而接觸阻塞,因此一般要把wait放到while循環內,若是是被其餘事件解除阻塞,其返回值不爲0,被解除阻塞的線程會再次執行wait函數而被阻塞。 code

(3)在線程被喚醒,繼續下一步操做前,先檢查一下謂詞條件是否爲真。尤爲是在使用廣播喚醒時,某些線程可能會超前改變謂詞的狀態。 對象

使用pthread_cond_timewait()阻塞線程時,若是線程由於超時而解除阻塞,下一步先檢查謂詞是否已經爲真,若是爲真則進行預約操做。 事件

喚醒等待線程的兩種方式:發信號和廣播。如何選擇? it

(1)當多個能夠完成某工做的線程被阻塞時,只須要一個線程被喚醒來完成此工做,使用發信號; class

(2)爲多個謂詞條件使用1個條件變量時,使用廣播,雖然被阻塞的線程都被喚醒,可是經過檢測謂詞,謂詞爲假的線程會繼續被阻塞。 thread

(3)多個線程同時被喚醒,使用廣播;只有一個等待線程時使用發信號,由於效率更高。 效率

相關文章
相關標籤/搜索