c++中的TBB concurrent_bounded队列和同步

TBB concurrent_bounded queue in C++ and synchronization

本文关键字:队列 同步 bounded 中的 TBB concurrent c++      更新时间:2023-10-16

我使用TBB concurrent_bounded_queue,因为这个类允许我们使用pop,如果没有元素可用,则pop被阻塞。队列的默认大小是多少?我还在一本书中读到,而不是使用concurrent_bounded_queue使用parallel_while或管道,这些将如何帮助我们代替concurrent_bounded_queue ?有谁能举例说明如何使用paralle_while或pipeline在两个线程之间通过同步共享数据吗?

谢谢!

默认大小当然是0,即队列中没有元素。但你可能想知道默认容量(即边界)。TBB参考手册说

A concurrent_bounded_queue <…>添加指定容量的功能。默认容量使得队列实际上是无界的。

源代码检查(src/tbb/concurrent_queue.cpp)给出了默认初始化容量的以下公式:

    my_capacity = size_t(-1)/(item_size>1 ? item_size : 2); 
对于pipelineparallel_while(注意后者已弃用),它们是算法,而不是容器,因此不能用于在两个线程之间共享数据。但是在某些情况下,使用pipeline可以取代基于线程的设计。例如,一个简单的生产者-消费者场景可以被一个两阶段的管道取代,其中第一阶段产生一段数据并将其传递给第二阶段进行处理(消费)。