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