You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++循环结束释放互斥锁后等待线程的状态问题

问题解答

线程B可以获取该锁,锁不会再属于线程A,原因如下:

  • 代码中的std::unique_lock<std::mutex> lock(r.mtx)定义在while循环内部,这个锁对象的生命周期仅局限于当前循环迭代的代码块内。
  • 当线程A执行到while循环末尾时,lock对象会被销毁,RAII机制会自动触发其析构函数,释放持有的互斥锁。此时互斥锁处于未被占用的状态,所有等待该锁的线程(包括B、C、D)都可以参与锁的竞争。
  • 线程A完成这次循环迭代后,会重新进入while循环的条件判断(std::chrono::system_clock::now() < tToc),如果条件成立,它会再次尝试创建lock对象去获取互斥锁——这时候它和其他线程是平等竞争的关系,不再拥有锁的所有权。

补充说明:调用r.cv.notify_all()后,所有等待的线程都会被唤醒,它们会竞争互斥锁;拿到锁的线程会执行lambda表达式判断条件,条件满足则继续执行后续逻辑,不满足则会再次进入等待状态。线程A在释放锁后,就和其他线程处于同一起跑线,不再持有锁。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:50:33