究竟什么时候是析构函数或在调用的线程上终止
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::terminate
。 t1
是一个普通的C++对象,这里是main
的局部变量。当它的作用域结束时它会被破坏——这里是 main 的结尾。因此,您必须在 returns 之前通过调用 t1
上的 join
或 detach
使 t1
不可连接。 function_1
是否已在其执行线程上完成 运行 无关紧要。
我正在使用 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::terminate
。 t1
是一个普通的C++对象,这里是main
的局部变量。当它的作用域结束时它会被破坏——这里是 main 的结尾。因此,您必须在 returns 之前通过调用 t1
上的 join
或 detach
使 t1
不可连接。 function_1
是否已在其执行线程上完成 运行 无关紧要。