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,就可以避免死等的問題。