[英]why is concurrent_queue non-blocking?
在VS2010中引入的并发运行时中,有一个concurrent_queue类。 它有一个非阻塞的try_pop()函数。
类似于英特尔线程构建模块(TBB),从版本2.1到2.2时,阻止pop()调用被删除。
我想知道阻塞调用的问题是什么。 为什么要从TBB中删除? 为什么没有阻塞concurrent_queue?
我正处于需要阻塞并发队列的情况,我不想忙碌等待。 除了自己编写队列之外,并发运行时还有另一种可能吗?
来自Arch Robison的评论 ,并没有比(a)更多的“马口” :
PPL的concurrent_queue
没有阻塞弹出,因此tbb::strict_ppl::concurrent_queue
也没有。 阻止弹出在tbb::concurrent_bounded_queue
可用。
省略阻塞弹出的设计参数是,在许多情况下,阻塞的同步是在队列外部提供的,在这种情况下,队列内部阻塞的实现变得不必要。
另一方面,旧tbb::concurrent_queue
的阻塞弹出在没有外部同步的用户中很流行。
所以我们分开了功能。 不需要阻塞或有界的用例可以使用新的tbb::concurrent_queue
,而需要它的用例可以使用tbb::concurrent_bounded_queue
。
(a) Arch是线程构建模块的架构师。
如果您需要阻塞弹出而没有繁忙的等待,则需要一种信令方法。 这意味着推送器和poper之间的同步,并且队列不再没有(昂贵的)同步原语。 您基本上可以获得一个正常的同步队列,其中一个条件变量用于通知poppers的push,这不在concurrent_ *集合的spirity中。
问题是并发运行时是否有另一个选项提供阻塞队列功能,因为concurrent_queue没有,VS2010中有一个。
Arch的注释当然是完全正确的,阻塞队列和解除阻塞队列是单独的用例,这就是它们在VS2010和TBB中不同的原因。
在VS2010中你可以使用位于其中的模板类unbounded_buffer,相应的方法称为enqueue和dequeue。
-Rick
从队列的角度来看,没有任何情况需要阻止插入或移除。 您可能需要阻止并等待插入的事实并不重要。
您可以通过使用条件变量或计数信号量或类似的东西(无论您的特定API提供)来实现您所需的功能。 你的麻烦不在阻塞/非阻塞; 它听起来像一个经典的生产者 - 消费者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.