工作原理
sequenceDiagram
消费者线程->>生产者线程: cv.wait(lock, cond)
生产者线程-->>消费者线程: cv.notify_one()
核心用法
.wait()
|
|
pred
用来检查是否继续等待lock
用来保证pred
所访问到的变量的线程安全
.notify_one() 和 .notify_all()
顾名思义,提醒正在等待的 condition_variable
停止等待
假醒
aka. spurious wakeup
产生原因
condition_variable
实际上依赖 OS 的具体实现
而一般 OS 的条件变量实现设计,出于性能考虑,会出现即使没有 notify
也会停止等待的情况,叫做假醒 Spurious Wakeup
解决方法
只要加上谓词 pred
判断等待条件,就不会出现假醒
i.e.
.wait(lock)
行为不可预测,别用.wait(lock, pred)
总该使用