條件變數和任務佇列
阿新 • • 發佈:2019-02-10
條件變數是一個或多個執行緒等待某個布林表示式為真,即等待別的執行緒“喚醒”它。條件變數的學名叫做管程。
條件變數對於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上面程式碼用while迴圈來等待條件變數,而不能用if語句。原因是存在虛假喚醒。
虛假喚醒指即使沒有執行緒broadcast或signal條件變數,wait也可能偶爾返回。
對於signal/broadcast端:
1.不一定要在mutex已上鎖的情況下呼叫signal
2.在signal之前一般要改變布林表示式
3.修改布林表示式通常要用mutex保護
4.區分signal和broadcast。broadcast通常用於表明狀態變化,signal通常用於表示資源可用。
void Queue::doPush