阻塞在std::condition_variable的线程收通知未获锁的行为问询
std::condition_variable通知后锁未释放的行为规范说明
当阻塞在std::condition_variable的线程收到通知时,它会尝试重新获取关联的互斥锁(即调用wait/wait_for/wait_until时传入的std::unique_lock绑定的mutex)。如果此时锁仍被其他线程持有(比如你测试中通过15秒睡眠让锁长期不可用),该线程会进入mutex的等待队列,等待锁被释放后再继续执行——这个行为完全符合C++标准,并非未定义行为。
从标准定义的wait系列函数流程可以明确这点:
- 线程调用
wait时,会先自动释放持有的unique_lock,然后阻塞等待通知。 - 收到通知(或触发超时、虚假唤醒)后,线程会自动尝试重新获取
unique_lock。 - 只有成功获取锁后,
wait函数才会返回,线程继续执行后续逻辑。
你的测试结果是符合规范的正常表现,不存在未定义行为的风险。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

