分离后C ++ 11线程是否会自动销毁

时间:2017-08-15 01:55:33

标签: c++ multithreading c++11 thread-safety

通常,我会假设C ++ 11线程在分离后自动销毁。但问题是,我找不到任何证明这一假设的东西。

根据this article

  

一旦分离,线程就应该永远存在。

永远?如果线程的功能完成,它的资源是否永远存在?

根据this article

  

调用此函数后,线程对象变为不可连接,可以安全销毁。

它可以被安全销毁,但它会自动销毁吗?

如果没有自动销毁,如何销毁它(不是强行,但是在线程结束后)

感谢阅读。

2 个答案:

答案 0 :(得分:8)

您应该参考更好的参考。来自std::thread::detach

  

将执行线程与线程对象分开,允许执行独立继续。一旦线程退出,任何已分配的资源都将被释放。

     

调用detach *this后不再拥有任何线程。

所以回答你的问题(如果他们还没有):

  

永远?

没有。如果线程结束(例如:如果它计数到10),则完成并且它不再运行。

  

它的资源是否永远存在?

不,当线程完成时,线程中的每个资源都被释放(如变量等)。

  

它可以被安全销毁,但它会自动销毁吗?

你是什​​么意思?线程完成后,无论您是否调用detach,它都会被自动销毁。唯一的区别是,在这里,它们指的是线程 object ,所以实际的std::thread实例。

因此,当线程对象被破坏时,无论您是否拥有实际线程已完成,您都必须调用joindetach。如果您没有,则会调用std::terminate

答案 1 :(得分:2)

std :: thread只是你平台本机线程库的一个薄包装......它除了一些标志和平台的原生句柄之外并没有真正包含在内部。 s线程表示(Unix和Windows都是一个奇特的整体标识符)。特别是类Unix系统,对std :: thread :: detach()的调用做了两件事:

  • 调用pthread_detach()的一些变体,它释放用于存储来自platform-native thread-main的返回void指针的数据结构。
  • 在类中设置一个标志,表示该线程已被分离,反过来,这会阻止析构函数抛出异常。

对于线程创建可能设置的任何其他资源,当您的主线程退出时,应由平台的运行时清理这些资源。

所以,换句话说,std :: thread :: detach只允许销毁包装器而不抛出异常;在线程的主要功能退出后,线程的执行上下文中会发生实际线程的堆栈和OS资源回收,这应该是100%自动的。