1. 条件变量 wait(lock, 谓词) 完整流程图
cpp开始 ↓ 持有互斥锁 lock(调用前必须持有) ↓ 进入while循环(防虚假唤醒) ↓ 判断谓词: !队列空? ┌───────────┴───────────┐ 不成立(空) 成立(非空) ↓ ↓ 执行wait(lock) 跳出循环,执行业务 ↓ 1. lock.unlock()(释放锁) ↓ 2. 线程阻塞,等待notify
2. wait(lock) 内部原子操作流程图
【调用 wait 前】已持有锁
↓
┌────────────┐
│ wait 内部执行 │
│ 1. unlock() 解锁 │ ← 关键:必须释放,否则死锁
│ 2. 线程阻塞休眠 │
│ 3. 被 notify 唤醒 │
│ 4. lock() 重新加锁 │ ← 保证返回时仍持有锁
└────────────┘
↓
【wait 返回】重新持有锁
3. 最精简一图流(面试背诵版)
加锁 → 循环判断条件
↓
不满足 → 解锁 → 阻塞 → 唤醒 → 重加锁 → 再判断
↓
满足 → 退出循环,执行业务