繁体   English   中英

为什么concurrent_queue是非阻塞的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM