c – 在无锁实现中没有互斥的condition_variable

我有一个使用std :: atomics实现的无锁单生成器多个使用者队列,其方式类似于Herb Sutters CPPCon2014 talk.

有时,生产者太慢,无法养活所有消费者,因此消费者可能会饿死.我想阻止饥饿的消费者在排队等待,因此我加入了10ms的睡眠.该值是任意的,不是最佳的.我想使用一个消息,一旦队列中有一个空闲插槽,消费者就可以发送给生产者.在基于锁的实现中,我自然会将std :: condition_variable用于此任务.但是现在在我的无锁实现中我不确定,如果它是引入互斥锁的正确设计选择,只能使用std :: condition_variable.

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

编辑:我有一个生产者,从不睡觉.并且有多个消费者,如果他们饿死就会入睡.因此整个系统总是在取得进展,因此我认为它是无锁的.
我目前的解决方案是在消费者GetData函数中执行此操作:
的std :: unique_lock<的std ::互斥> LK(_idleMutex);
_readSetAvailableCV.wait(LK);

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

最佳答案 我刚观看了关于并发TS的CPPCON视频:

Artur Laksberg @cppcon2015

在这次演讲的中间,Artur解释了我的问题究竟是如何通过障碍和锁存来解决的.他还以我的方式使用condition_variable显示现有的解决方法.他强调了一些关于用于此目的的condition_variable的弱点,比如在你进入等待之前的虚假唤醒和丢失通知信号.
但是在我的应用程序中,这些限制没有问题,所以我想现在,我将使用我在编辑帖子中提到的解决方案 – 直到锁存器/ barrierers可用.
谢谢大家的评论.

点赞