1. 程式人生 > >條件變數和任務佇列

條件變數和任務佇列

條件變數是一個或多個執行緒等待某個布林表示式為真,即等待別的執行緒“喚醒”它。條件變數的學名叫做管程。

條件變數對於wait端:

1.必須與mutex一起使用,該布林表示式的讀寫需要受到mutex的保護。

2.在mutex已上鎖的時候才能呼叫wait()

3.把判斷布林條件和wait()放在while迴圈中。

int Queue::getFront(){ Lock l(&(this->mutex)); while(q.empty()) { pthread_cond_wait(&cond,&mutex); } assert(!q.empty
()); int connfd=q.front(); q.pop(); return connfd;}

上面程式碼用while迴圈來等待條件變數,而不能用if語句。原因是存在虛假喚醒。

虛假喚醒指即使沒有執行緒broadcast或signal條件變數,wait也可能偶爾返回。

對於signal/broadcast端:

1.不一定要在mutex已上鎖的情況下呼叫signal

2.在signal之前一般要改變布林表示式

3.修改布林表示式通常要用mutex保護

4.區分signal和broadcast。broadcast通常用於表明狀態變化,signal通常用於表示資源可用。

void Queue::doPush
(int connfd){ { Lock l(&(this->mutex)); q.push(connfd); } pthread_cond_signal(&cond);}