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

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()重载版本(带谓词的这个),内部逻辑大致是这样的:

  1. 释放传入的unique_lock
  2. 阻塞等待通知
  3. 被唤醒后重新获取unique_lock
  4. 检查谓词,如果为true则返回;否则重复1-3步骤

这种设计就是专门用来避免生产者/消费者模型中的锁竞争死锁问题的,所以你担心的情况根本不会发生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:04