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

时间:2016-01-28 14:45:56

标签: c++ multithreading c++11 thread-safety producer-consumer

有两个主题 A (制作人)和 B (消费者)。

A 生成的数据仅用读取,因此 B 只允许读取一次 A 已经产生了一大块。 单个数据是一个简单的结构,块长度是可变的。例如,一旦可能是在生成50个数据后允许读取 B ,则另一个时间可能是200个。

我发现了我想要使用的生产者/消费者队列的这种实现: https://github.com/cameron314/readerwriterqueue

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

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

2 个答案:

答案 0 :(得分:2)

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

template<typename T, typename Alloc>
class concurrent_queue;

(请注意,有些图书馆已经为您提供了此类容器,例如英特尔TBB。)

模板参数T是您在生产者和消费者之间交换的内容。当你要求消费块时,请T = your_chunk_type。假设您的块大小可变:Chunk = std::vector<something>。使用你在github上链接的lib,你可以使用ReaderWriterQueue<Chunk>作为共享工作的队列。

答案 1 :(得分:0)

您可以使用标准大小的数据块并拥有一个或多个框架块,这些块可以指示消息的开始和结束,也可以只是一个也具有长度的开始块。邮件存储在其中。