多个线程执行的输出只发生一次?

时间:2018-06-07 11:01:39

标签: c++ multithreading vector

#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));
    }
}

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

4 个答案:

答案 0 :(得分:1)

此循环完成后,将调用std::vector<std::thread>的析构函数。 std::thread destructor calls std::terminate if the thread was neither detached nor joined,就像你的情况一样。

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

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

答案 1 :(得分:1)

确保加入主题以等待所有主题完成:

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

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

std::cout << std::flush;

答案 2 :(得分:0)

即使你没有加入,它仍然应该打印&#34;执行线程&#34; 100次。

也许问题是使用&#34; endl&#34;而不是&#34; std :: endl&#34;

答案 3 :(得分:0)

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

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

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

虽然这会导致调用std::terminate函数并提前终止您的程序,但这会导致另一个问题,因为main函数会结束此过程及其所有主题

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