为啥我必须为 boost::condition_variable 设置一个 boost::mutex?

Posted

技术标签:

【中文标题】为啥我必须为 boost::condition_variable 设置一个 boost::mutex?【英文标题】:why must I have a boost::mutex for boost::condition_variable?为什么我必须为 boost::condition_variable 设置一个 boost::mutex? 【发布时间】:2014-01-12 18:14:20 【问题描述】:

我有以下代码: 其中 m_event 是一个 boost::condition_variable

        boost::scoped_lock dummy;
        boost::unique_lock<boost::scoped_lock> lock(dummy); // TODO: see if dummy is correct
        m_event.wait(lock, [this] () 
            return !this ->m_enqueue.empty();
        );

我真的不需要那个虚拟储物柜我只是希望事件在某个布尔条件下停止, 我有什么不明白的吗?

为什么我不得不使用假锁?

(P.S. 代码效果很好..)

编辑: 事实上,如果我理解正确的话,我在课堂上拥有的是 boost::mutex,我们称之为 m_mtx 和明显的插入器到 m_enqueue.. 所以我将我的实现相应地更改为锁定 m_lock ,然后插入器只会这样做:

boost::mutex::scoped_lock<boost::mutex> guard(m_lock);

有意义吗?

【问题讨论】:

见this previous answer @ichramm:这是个问题!还有it's a subtly different one,在那... 【参考方案1】:

timed_wait 等待获得锁,如果它及时获得。

没有锁,它什么也做不了。

在我看来你在滥用timed_wait

【讨论】:

timed_wait 是最近添加的,不相关,等待同样的问题 “不相关”是什么意思?你的问题是关于它的,不是吗? 不,这就是我必须使用虚拟互斥锁的原因,如果您一起删除超时,问题仍然存在,我将编辑 @Alon:是的,超时不是问题的重要部分我的答案。我真的不明白你希望这个函数在没有锁的情况下做什么。

以上是关于为啥我必须为 boost::condition_variable 设置一个 boost::mutex?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我必须为 Code First / Entity Framework 提供无参数构造函数

为啥我必须删除为 UITableViewCell 添加的子视图,而不是在 UITableViewCell 的子类中?

为啥我必须为 boost::condition_variable 设置一个 boost::mutex?

Ghostscript:为啥我必须为 PDF/A 转换提供 pdfa_def.ps?

为啥我收到警告说必须初始化一个不可为空的字段(当我确定我正在初始化它时)?

Java - 为啥必须为每个回溯基本案例创建一个新实例?