【问题标题】: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);

【问题讨论】:

    标签: c++ multithreading asynchronous


    【解决方案1】:

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

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

    【讨论】:

    • 很好的解释。那么有没有办法稍微改变第二个版本,以便它可以创建三个线程而不等待消费者函数完成?
    • @user3081703 如果您不关心结果,为什么不使用std::thread 呢?并将它们推回向量中,这样它们就不会被破坏(您可以稍后在需要时加入它们)。
    猜你喜欢
    • 2016-08-30
    • 1970-01-01
    • 2011-10-23
    • 2023-03-13
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多