单一生产者,多种消费者架构

时间:2015-01-20 15:56:24

标签: c++ multithreading lock-free

我面临着并行化一个简单的poll-process循环,如下所示:

while(!done)
    buffer = poll(...)
    foreach(item i in buffer)
        process(i)

问题出在单个生产者/多个消费者模式之后,但生成的项目必须由 所有 消费者使用。

考虑到实现必须是多线程C ++代码,我应该使用什么样的数据结构?

感谢您的建议!

2 个答案:

答案 0 :(得分:1)

如果您事先了解消费者数量,则每个消费者可以拥有一个队列。

如果动态添加和删除使用者,则必须决定如何处理在创建使用者之前生成的消息。如果所有消费者都必须处理所有消息 - 使用向量来保留所有消息,并让每个消费者只保留服务器中最后处理消息的索引。

不要忘记同步对矢量的访问,因为当生产者添加项目时可以重新分配

答案 1 :(得分:0)

我想最好的选择是为每个消费者创建一个消息队列。

这意味着所有消费者都必须向生产者注册,然后,生产者应该将消息排队到每个消息队列。

一个好的实现选项应该是在生产者和消费者之间创建一个代理对象,代理对象是一个混合对象,这意味着它消耗来自生产者的所有消息,但也将它们转发给所有注册的消费者。