究竟是析构函数还是终止于称为

时间:2019-10-06 06:51:51

标签: c++11 stdthread

我正在使用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(或调用者线程)返回的原因吗?

1 个答案:

答案 0 :(得分:0)

看起来您在混淆两件事:std::thread对象和该对象管理的执行线程。

std::terminate的调用是由std::thread对象的析构函数触发的,如果是可连接的。这与std::thread对象管理的执行线程是否已经完成执行没有直接关系。

在您的代码中,t1的析构函数将触发std::terminatet1是普通的C ++对象,此处为main的局部变量。当作用域结束时,它会被破坏-这里是main的结尾。因此,必须通过在t1上调用joindetach来使t1不可加入主要回报。 function_1是否已在其执行线程上完成运行无关紧要。