具有多个消费者的线程队列

Posted

技术标签:

【中文标题】具有多个消费者的线程队列【英文标题】:Thread queue with multiple consumer 【发布时间】:2014-05-19 06:51:47 【问题描述】:

我正在做线程队列,消费者从队列中获取项目,生产者将项目放入队列。创建的消费者数量来自用户输入。我尝试了以下两种方法。第一个版本运行良好,但第二个版本不行。由于用户输入限制,我无法使用第一个版本。其实我没看懂这两者的区别。第一个是同时创建三个线程,而第二个是一个一个创建?这有什么线索吗?

auto c1 = async(launch::async, consumer);
auto c2 = async(launch::async, consumer);
auto c3 = async(launch::async, consumer);

for(int i = 1; i <= 3; i++)
    auto c1 = async(launch::async, consumer);

【问题讨论】:

【参考方案1】:

两者在某种程度上是相等的,因为两者都一个接一个地启动三个异步任务。

两者在某种程度上是不同的,因为对于循环,变量c1 被限制在循环内的生命周期内,并且每次循环迭代时都会超出范围(并被破坏)。可能正是这一点造成了所有的不同:对象c1 被破坏,必须等待consumer 函数完成才能被破坏。

【讨论】:

很好的解释。那么有没有办法稍微改变第二个版本,以便它可以创建三个线程而不等待消费者函数完成? @user3081703 如果您不关心结果,为什么不使用std::thread 呢?并将它们推回向量中,这样它们就不会被破坏(您可以稍后在需要时加入它们)。

以上是关于具有多个消费者的线程队列的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。)

如何实现具有多个消费者的单个队列

具有多个消费者但只有一个活动的 MQ 队列

在 SQS 队列中使用多个消费者

多线程案例-阻塞式队列

RabbitMQ中有大批量的消息,此时多个消费者同时访问消息队列是怎样取里面的消息的?