【问题标题】:Output of multiple thread executions only happens once? [duplicate]多线程执行的输出只发生一次? [复制]
【发布时间】:2018-11-17 06:29:19
【问题描述】:
#include <iostream>
#include <thread>

void func() {
    std::cout << "Hello";
}

int main() {
    std::vector<std::thread> threads; 
    int n = 100;
    for (int i = 0; i < n; i++) {
         std::cout << "executing thread" << std::endl;
         threads.push_back(std::thread(func));
    }
}

我的程序打印一次“执行线程”并结束。是什么原因?

【问题讨论】:

  • 请创建Minimal, Complete, and Verifiable Example 向我们展示。
  • 您的程序可能在任何线程实际开始之前结束。但是,是的,如果您想要答案,请提供 MCVE。
  • 您遇到的当前问题与副本中的相同。一旦你解决了问题,这里的所有答案都会告诉你。
  • @UKMonkey,“在函数中启动线程”是什么意思?
  • @jameslarge 查看编辑历史

标签: c++ multithreading vector


【解决方案1】:

在这个循环完成后,std::vector&lt;std::thread&gt; 的析构函数被调用。 std::thread destructor calls std::terminate if the thread was neither detached nor joined,就像你的情况一样。

要解决这个问题,请在循环后添加以下内容:

for(auto& thread : threads)
    thread.join();

【讨论】:

    【解决方案2】:

    确保加入线程以等待它们全部完成:

    for (auto &thread : threads) {
        thread.join();
    }
    

    如果程序在此点之后继续并且没有立即退出,则刷新输出,因为它可能被缓冲:

    std::cout << std::flush;
    

    【讨论】:

    • 即使在循环之后添加了这些代码行,我的 for 循环也只执行一次。 @jspcal
    • OP 有 std::endl 已经刷新了流
    • 问题不是关于"Hello",而是关于main 中的cout,它只出现一次并且有一个endl
    • OPs 在一个不同的答案下面评论:“我想你没有得到我的问题。循环只执行一次,即“执行线程”只打印一次。这就是我遇到的问题“
    • @user463035818:这无关紧要。关于需要冲洗的观点是正确的。
    【解决方案3】:

    即使你不加入,它仍然应该打印 100 次“执行线程”。

    也许问题在于使用“endl”而不是“std::endl”

    【讨论】:

      【解决方案4】:

      一旦创建线程的循环完成,您的程序就会继续。它继续离开main 函数,这会导致main 函数内定义的所有变量超出范围并结束它们的生命周期。这会导致对象的销毁,包括向量,然后导致向量中的所有线程对象被销毁。

      正如其他人所指出的,如果线程没有加入或分离,线程对象的销毁将导致程序终止。


      虽然其他答案告诉您加入线程(IMO 是此处推荐的解决方案),但还有另一种可能的解决方案:分离线程。

      虽然这会导致std::terminate 函数被调用并过早终止您的程序,但这会导致另一个问题,因为离开main 函数会结束进程并且它的所有线程

      如果由于某种原因您的线程在main 函数退出后继续存在,您需要分离线程使用操作系统特定的退出“主线程”功能。这将使进程继续运行,而您创建的所有线程仍在运行。

      【讨论】:

      • 我猜你没有得到我的问题。循环只执行一次,即“执行线程”只打印一次。这就是我遇到的问题。
      猜你喜欢
      • 2014-03-04
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多