【问题标题】:single producer single consumer queue with "blocking" pop带有“阻塞”弹出的单生产者单消费者队列
【发布时间】:2014-10-21 13:32:55
【问题描述】:

我正在寻找具有“阻塞”弹出的单生产者单消费者队列。 Boost spsc_queue 几乎没问题,除了一种方法:

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

此方法是“非阻塞”的,如果没有数据则立即返回。 我希望这种方法“阻塞”并等到一些数据到达。

我应该使用哪些集合?

upd 至少有人可以建议任何具有阻塞弹出的 c++ 队列吗?

【问题讨论】:

  • 有趣。我也应该用 intel 版本替换 boost spsc_queue 吗?
  • 除了英特尔的实现,我们还有什么?
  • 很少有严重的并发c++库。如我的回答所述,我强烈考虑包装现有容器。
  • 据我了解tbb:concurrent_bounded_queue 是多个生产者,多个消费者。我需要一个生产者一个消费者队列,这可以简化事情吗?可能可以使用更简单的实现?

标签: c++ multithreading c++11


【解决方案1】:

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

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

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

英特尔 TBB 具有 tbb::concurrent_bounded_queue,它可能也适合您的需求。

【讨论】:

  • 为什么包装现有容器比使用 tbb:concurrent_bounded_queue 更好?
  • @javapowered 我并不认为它更好,但它可能对您当前的代码库影响较小(如果您还没有它,则无需在您的项目中使用 brin tbb,不需要太多代码修改)
  • 这种队列的下注性能比intel的实现差很多?
  • @javapowered 同意,但如果你包装的唯一东西是阻塞弹出,那么你主要是在比较 boost spsc 与 tbb cbq,我会确定基准......但 tbb 队列是已知的要真的快:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多