C++11中Detector-Reactor模式下是否会发生死锁?
关于Detector/Reactor模式中条件变量的死锁疑问解答
首先直接给结论:这种情况完全不会发生死锁,核心原因在于std::condition_variable::wait()的特殊行为,我给你一步步拆解:
先回顾下你给出的两段核心代码:
Detector 代码
std::condition_variable cv; std::mutex m; bool flag(false); // ... 检测到事件时: { std::lock_guard<std::mutex> g(m); flag = true; } cv.notify_one();
Reactor 代码
{ std::unique_lock<std::mutex> lk(m); cv.wait(lk, [] {return flag;} ); // ... 后续处理逻辑 }
具体场景分析
当Reactor先执行,成功获取到mutex m的锁,然后进入cv.wait(lk, ...)时,wait()函数会自动释放当前持有的unique_lock锁,然后进入阻塞状态等待通知。
这时候Detector就可以正常获取mutex m的锁,修改flag为true,解锁后调用cv.notify_one()唤醒等待的条件变量。
当Reactor收到通知后,会重新尝试获取unique_lock锁,获取成功后执行传入的lambda表达式检查flag——此时flag已经是true,所以wait()会返回,Reactor继续执行后续逻辑。
关键知识点
std::condition_variable的wait()重载版本(带谓词的这个),内部逻辑大致是这样的:
- 释放传入的
unique_lock- 阻塞等待通知
- 被唤醒后重新获取
unique_lock- 检查谓词,如果为true则返回;否则重复1-3步骤
这种设计就是专门用来避免生产者/消费者模型中的锁竞争死锁问题的,所以你担心的情况根本不会发生。
内容的提问来源于stack exchange,提问作者WhatABeautifulWorld
相关产品推荐
相关产品推荐

