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
相关产品推荐
相关产品推荐

