#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));
}
}
我的程序打印一次“执行线程”并结束。原因是什么?
答案 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 ;使用特定于操作系统的功能。这将使进程继续运行,所有创建的线程仍在继续。