为什么concurrent_queue是非阻塞的?

eli*_*eli 15 c++ queue concurrency

在VS2010中引入的并发运行时,有一个concurrent_queue类.它有一个非阻塞的try_pop()函数.
类似于英特尔线程构建模块(TBB),从版本2.1到2.2时,阻止pop()调用被删除.

我想知道阻塞调用的问题是什么.为什么要从TBB中删除?为什么没有阻塞concurrent_queue?

我正处于需要阻塞并发队列的情况,我不想忙碌等待.除了自己编写队列之外,并发运行时还有另一种可能吗?

pax*_*blo 26

来自Arch罗宾逊评论,并没有得到更多的"马嘴"(一):


PPL concurrent_queue没有阻止弹出,因此也没有tbb::strict_ppl::concurrent_queue.阻止弹出可用于tbb::concurrent_bounded_queue.

省略阻塞弹出的设计参数是,在许多情况下,阻塞的同步是在队列外部提供的,在这种情况下,队列内部阻塞的实现变得不必要.

另一方面,旧的阻塞流行音乐tbb::concurrent_queue在没有外部同步的用户中很受欢迎.

所以我们分开了功能.不需要阻塞或有界的tbb::concurrent_queue用例可以使用new ,并且需要它的用例可以使用tbb::concurrent_bounded_queue.


(a) Arch是线程构建模块的架构师.