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<something>
。使用您在 github 上链接的 lib,您可以使用 ReaderWriterQueue<Chunk>
作为共享工作的队列。
【讨论】:
所以你说我可以使用 std::vector 作为我链接的 ReaderWriterQueue 的模板参数? 是的,你可以。std::vector<XYZ>
具有在编译时已知的明确定义的大小。队列会为其std::vector
s分配内存,每个std::vector
会为其项目分配额外的内存
啊,好吧,我想我开始明白了。向量中有多少元素并不重要,对吧?由于向量中元素的内存在其他地方。
是的,完全正确。它只是一个以类型安全的方式为您处理内存缓冲区的层。【参考方案2】:
您可以坚持使用标准大小的数据块,并拥有一个或多个 框架 块来指示消息的开始和结束,或者可能只是一个也具有长度的开始块消息存储在其中。
【讨论】:
以上是关于C ++ - 生产者/消费者只允许在定义的块中消费的主要内容,如果未能解决你的问题,请参考以下文章