我有一个基于std::atomics实现的无锁单生产者多消费者队列,类似于Herb Sutter在CPPCon2014上的演讲。有时,生产者速度过慢以至于不能满足所有消费者的需求,因此消费者可能会饥饿。我想防止饥饿的消费者反复查询队列,因此我增加了一个10ms的睡眠时间。这个值是任意的且不够优化。我希望使用一种信号方式,让消费者在队列中有空闲位置时可以通知生产者。在基于锁的实现中,我自然会使用std::condition_variable来完成这个任务。但现在在我的无锁实现中,我不确定是否应该引入一个mutex,只是为了能够使用std::condition_variable。 我只是想问你,在这种情况下,是否应该使用mutex?
编辑:我只有一个从不休眠的生产者,同时存在多个可能会饥饿而休眠的消费者。因此整个系统总是在向前进行,因此我认为它是无锁的。我的当前解决方案是将以下代码放入消费者的GetData函数中:
编辑:我只有一个从不休眠的生产者,同时存在多个可能会饥饿而休眠的消费者。因此整个系统总是在向前进行,因此我认为它是无锁的。我的当前解决方案是将以下代码放入消费者的GetData函数中:
std::unique_lock<std::mutex> lk(_idleMutex);_readSetAvailableCV.wait(lk);
生产者线程在准备好新数据时使用以下代码: _readSetAvailableCV.notify_all();