C++ - 生产者/消费者只允许消费定义的块

C++ - Producer / Consumer only allow consumption in defined chunks

有两个线程 A(生产者)和 B(消费者)。

A 产生的数据只能在 中读取,因此 B只有在 A 生成了整个块后才允许读取。 单条数据是一个简单的结构,块长度是可变的。比如有一次可能是B在产生50条数据后允许读取,还有一次可能是200.

我找到了我想使用的 producer/consumer 队列的实现: https://github.com/cameron314/readerwriterqueue

我目前的想法是A将其数据写入std::vector,然后将std::vector传入队列。但我怀疑这是否可行,因为队列不知道 std::vector 将占用多少内存,并且它想预先分配内存。

我希望有人知道更简单的解决方案。

您可以坚持使用标准大小的数据块,并使用一个或多个 framing 块来指示消息的开始和结束,或者可能只是一个起始块也其中存储了消息的长度。

无论您生产或消费什么,您都需要一个并发队列用于生产者和消费者之间的通信。如果我们用 C++ 风格来做,你最终会得到类似这样的东西:

template<typename T, typename Alloc>
class concurrent_queue;

(请注意,某些库已经为您提供了此类容器,例如 Intel TBB)。

模板参数T是你在生产者和消费者之间交换的。正如您要求消耗块一样,这里 T = your_chunk_type。假设您的块大小可变:Chunk = std::vector<something>。使用您在 github 上链接的库,您可以使用 ReaderWriterQueue<Chunk> 作为共享工作的队列。