条件变量总让人困惑:为什么 wait 要传 guard?为什么要用 while?通知会丢吗?notify_one 和 notify_all 差在哪?这篇每个问题都用一个真实运行的小实验回答。
编译:成功
运行(退出码 0):
等到条件为真,等了约 100 ms(取整到 50)Mutex 的基础见Mutex 与 RwLock。
编译:成功
运行(退出码 0):
子线程正在 wait 时,主线程 try_lock 成功: true(wait 释放了锁)
子线程醒来读到 7 编译:成功
运行(退出码 0):
先 notify 后 wait(没有状态变量):wait_timeout 超时了吗? true(通知丢失)
先通知(置 true)后 wait_while:超时了吗? false 条件 = true虚假唤醒(spurious wakeup)是 while 循环的另一个理由,这次实验没有复现出来。
编译:成功
运行(退出码 0):
5 个线程在 wait:notify_one 唤醒了 1 个;notify_all 唤醒了 5 个 编译:成功
运行(退出码 0):
收到 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],墙钟时间约 550 ms,进程 CPU 时间约 1 ms(消费者睡眠,没有忙等)通道封装了这个模式,见Channel 消息传递。