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

Posted

技术标签:

【中文标题】C ++ - 生产者/消费者只允许在定义的块中消费【英文标题】:C++ - Producer / Consumer only allow consumption in defined chunks 【发布时间】:2016-01-28 14:45:56 【问题描述】:

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

A产生的数据只能以chunks的形式被读取,因此B只能被A读取一次 已经产生了一整块。 单个数据是一个简单的结构,块长度是可变的。比如有一次可能是B在产生50条数据后才允许读取,另一次可能是200条。

我找到了我想使用的生产者/消费者队列的实现: https://github.com/cameron314/readerwriterqueue

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

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

【问题讨论】:

块的并发队列。 您是否尝试过您的解决方案,如果是,在队列中存储std::vector 出了什么问题? 您的块是可变大小的消息。如果您选择的队列不允许可变大小的消息,则需要另一个队列。 ' A 将其数据写入 std::vector,然后将 std::vector 传递到队列中' - 试试看:) 好的,谢谢大家,我只是认为这可能行不通 - 因为我已经根据项目的大小链接分配内存的队列。 【参考方案1】:

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

template<typename T, typename Alloc>
class concurrent_queue;

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

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

【讨论】:

所以你说我可以使用 std::vector 作为我链接的 ReaderWriterQueue 的模板参数? 是的,你可以。 std::vector&lt;XYZ&gt; 具有在编译时已知的明确定义的大小。队列会为其std::vectors分配内存,每个std::vector会为其项目分配额外的内存 啊,好吧,我想我开始明白了。向量中有多少元素并不重要,对吧?由于向量中元素的内存在其他地方。 是的,完全正确。它只是一个以类型安全的方式为您处理内存缓冲区的层。【参考方案2】:

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

【讨论】:

以上是关于C ++ - 生产者/消费者只允许在定义的块中消费的主要内容,如果未能解决你的问题,请参考以下文章

生产者-消费者”问题 用C语言编写

用生产者消费者理解golang channel

使用无锁队列(环形缓冲区)注意事项

JAVA模拟生产者与消费者实例

C中的任何单消费者单生产者无锁队列实现?

Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用