无锁实现中没有互斥锁的condition_variable

bod*_*unt 5 c++ multithreading c++11

我使用std::atomics类似于 Herb Sutters CPPCon2014演讲的方式实现了一个无锁的单生产者多消费者队列。

有时,生产者太慢而无法满足所有消费者的需求,因此消费者可能会饿死。我想防止饥饿的消费者加入队列,因此我为10ms. 这个值是任意的,不是最优的。我想使用一个信号,一旦队列中再次有空闲插槽,消费者就可以将其发送给生产者。在基于锁的实现中,我自然会使用std::condition_variable此任务。但是现在在我的无锁实现中我不确定,如果引入 a 是正确的设计选择mutex,只是为了能够使用std::condition_variable

我只是想问你,如果 mutex在这种情况下是否是正确的方法?

编辑:我有一个从不睡觉的制作人。并且有多个消费者,如果他们饿了就去睡觉。因此整个系统一直在进步,因此我认为它是无锁的。我当前的解决方案是在消费者 GetData 函数中执行此操作:
std::unique_lock<std::mutex> lk(_idleMutex); _readSetAvailableCV.wait(lk);

一旦新数据准备好,这在生产者线程中:
_readSetAvailableCV.notify_all();

bod*_*unt 3

我刚刚观看了有关并发 TS 的 CPPCON 视频: Artur Laksberg @cppcon2015

在这次演讲的中间,阿图尔解释了如何通过障碍和闩锁来解决我的问题。他还按照我的方式展示了使用 condition_variable 的现有解决方法。他强调了用于此目的的 condition_variable 的一些弱点,例如虚假唤醒和在进入等待之前丢失通知信号。然而,在我的应用程序中,这些限制不是问题,所以我想现在,我将使用我在帖子编辑中提到的解决方案 - 直到闩锁/屏障可用。谢谢大家的评论。