究竟什么时候是析构函数或在调用的线程上终止

When exactly is a destructor or terminate on a thread called

我正在使用 C++11 std::thread。我的困惑基于以下几点:

如果 join()detach() 都没有被调用,线程上的

terminate() 就会被调用。 这意味着当线程 returns:

a. 它检查是否调用了 join()detach() ,如果没有,则调用 terminate() (产生核心转储),

b. 如果调用 join() 线程的析构函数将由 main(或调用线程)调用

c. 如果在线程执行时调用 detach() ,则线程不会 return 到 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...." 之后 2 次睡眠后调用终止,就在 return 0; 之前 这是否意味着直到主线程(或称为线程)returns 才清理线程(未调用其析构函数)?

这就是为什么应该 detach() 以便线程清理不必等到主线程(或调用线程)return 的原因吗?

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

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

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