具有“阻塞”弹出的单生产者单消费者队列

5

我正在寻找一个带有“阻塞”pop功能的单生产者单消费者队列。 Boost spsc_queue 几乎完美,除了其中一种方法:

bool pop(T & ret);
Pops one object from ringbuffer.

这个方法是“非阻塞”的,如果没有数据,则立即返回。

我希望这个方法是“阻塞的”,等待直到有数据到达。

我应该使用哪些集合?

更新:至少有人能推荐一个具有阻塞弹出功能的c++队列吗?


3
请查看tbb:concurrent_bounded_queue。这是一个并发有界队列的参考文档。 - quantdev
有趣。我应该也用英特尔版本替换掉boost spsc_queue吗? - Oleg Vazhnev
除了英特尔的实现,我们还有什么别的? - Oleg Vazhnev
有非常少的严肃并发C++库。正如我在答案中所述,我强烈建议包装现有的容器。 - quantdev
据我了解,tbb:concurrent_bounded_queue 是多生产者、多消费者队列。我需要一个生产者和一个消费者的队列,这样可以简化事情吗?可能可以使用更简单的实现方式吗? - Oleg Vazhnev
这个实现怎么样?https://github.com/juanchopanza/cppblog/blob/master/Concurrency/Queue/Queue.h http://juanchopanzacpp.wordpress.com/2013/02/26/concurrent-queue-c11/ - Oleg Vazhnev
1个回答

0

并发队列很少提供弹出阻塞接口:在许多情况下,用户应该执行阻塞逻辑,以避免队列实现的不必要开销。

也就是说,您可以在queue::pop周围添加一个包装器来执行以下操作:

bool blocking_pop(T & t) {
  while(!queue.empty())
    wait();
  return queue.pop(t);
}

Intel TBB拥有tbb::concurrent_bounded_queue,这也可能适合您的需求。


为什么包装现有容器比使用tbb:concurrent_bounded_queue更好? - Oleg Vazhnev
@javapowered 我不会声称它更好,但它可能对您当前的代码库影响较小(如果您还没有tbb,则无需将其引入项目中,需要修改的代码也不多)。 - quantdev
这种队列的性能比英特尔的实现要差得多吗? - Oleg Vazhnev
@javapowered 我同意,但如果你只包装阻塞弹出操作,那么你主要是在比较boost spsc和tbb cbq,我建议进行基准测试以确保...但是众所周知,tbb队列非常快:) - quantdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接