我正在使用C ++ 11 std :: thread。我的困惑基于以下几点:
如果未同时调用terminate()
和join()
,则在线程上调用 detach()
。
这意味着当线程返回时:
a。。它检查是否调用了join()
或detach()
,如果未调用,则调用terminate()
(产生核心转储),< / p>
b。。如果调用join()
,则线程的析构函数将由main(或调用线程)调用
c。。如果在执行线程时调用了detach()
,则该线程将不会返回main进行清理,而是由该线程本身执行负责调用自己的析构函数
问题:如果以上几点是正确的,那么我不理解 在哪个确切点 是终止线程还是终止线程的决定?不是基于是否调用join()
或detach()
?
void function_1()
{
return;
}
int main()
{
std::thread t1(function_1);
std::cout<<"\nFirst Sleep for 5 seconds:\n";
sleep(5);
cout<<"\n2nd Sleep for 5 seconds:\n";
sleep(5);
if(t1.joinable())
{
cout<<"\nGonna join()\n";
t1.detach();
}
cout<<"Exiting from main ...\n";
}
由于该线程将在第5秒之前完成其执行,因此我认为该线程应该终止,因为到此为止还没有join()/detach()
。但是没有terminate()
被调用。而是成功分离了一个线程。
但是,如果我不分离,则在"Exiting from main...."
之后,return 0;
之前2个睡眠之后调用终止
这是否意味着在主线程(或称为线程)返回之前,不清理线程(不调用其析构函数)?
这是为什么应该detach()
以便线程的清理不必等到main(或调用者线程)返回的原因吗?
答案 0 :(得分:0)
看起来您在混淆两件事:std::thread
对象和该对象管理的执行线程。
对std::terminate
的调用是由std::thread
对象的析构函数触发的,如果是可连接的。这与std::thread
对象管理的执行线程是否已经完成执行没有直接关系。
在您的代码中,t1
的析构函数将触发std::terminate
。 t1
是普通的C ++对象,此处为main
的局部变量。当作用域结束时,它会被破坏-这里是main的结尾。因此,必须通过在t1
上调用join
或detach
来使t1
不可加入主要回报。 function_1
是否已在其执行线程上完成运行无关紧要。