具有多个消费者的线程队列
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
呢?并将它们推回向量中,这样它们就不会被破坏(您可以稍后在需要时加入它们)。以上是关于具有多个消费者的线程队列的主要内容,如果未能解决你的问题,请参考以下文章