爲什麼condition_wait要用while來判斷condition條件?

condition_variable使用基本形式如下:

lock

while(condition) {

wait(lock)

}

https://blog.csdn.net/matrixyy/article/details/50929150 

lock後,wait實際上會unlock,然後其他線程纔可能通過

lock

change condition

notify

修改condition並通知

但是修改condition可能condition不變,也可能又有一個線程將condition又改回,那麼condition還是不滿足,所以還是需要判斷,所以使用while.

使用while也不是絕對的,例如下面的情況:

線程A,從vector取數據

while(!exit) {

lock

while(vector.isEmpty) { // 這裏while改爲if

wait(lock)

}

deal data or not // 判斷是否真的需要處理數據

}

線程B,往vector填數據,可能提前結束

while(!exit) {

lock

vector.push

notify

}

notify_exit

若B線程提前結束了,即使最後發了notify,A線程也會死等,因爲vector始終爲空。

但是while改成if,就可以避免死等的問題。

 

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