工作原理
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)总该使用