C++ 面试题
条件变量为何总要配合谓词
理解虚假唤醒和共享条件的竞争。
原理
被通知只代表需要重新检查条件。多个消费者同时唤醒时,可能已有另一个线程把队列里的唯一任务取走。
开发中的做法
生产者在同一把互斥锁下更新队列状态。消费者用带谓词的 wait,在重新持有锁后检查关闭标记或队列是否非空。
验证与追问
测试空队列关闭、有积压时关闭和多个消费者争抢一个任务。提前说清关闭语义是消费完剩余任务,还是立刻退出。
代码片段
cv.wait(lock, [&] { return stopped || !jobs.empty(); });