通常,我会假设C ++ 11线程在分离后自动销毁。但问题是,我找不到任何证明这一假设的东西。
一旦分离,线程就应该永远存在。
永远?如果线程的功能完成,它的资源是否永远存在?
调用此函数后,线程对象变为不可连接,可以安全销毁。
它可以被安全销毁,但它会自动销毁吗?
如果没有自动销毁,如何销毁它(不是强行,但是在线程结束后)
感谢阅读。
答案 0 :(得分:8)
您应该参考更好的参考。来自std::thread::detach
:
将执行线程与线程对象分开,允许执行独立继续。一旦线程退出,任何已分配的资源都将被释放。
调用detach
*this
后不再拥有任何线程。
所以回答你的问题(如果他们还没有):
永远?
没有。如果线程结束(例如:如果它计数到10),则完成并且它不再运行。
它的资源是否永远存在?
不,当线程完成时,线程中的每个资源都被释放(如变量等)。
你是什么意思?线程完成后,无论您是否调用它可以被安全销毁,但它会自动销毁吗?
detach
,它都会被自动销毁。唯一的区别是,在这里,它们指的是线程 object ,所以实际的std::thread
实例。
因此,当线程对象被破坏时,无论您是否拥有实际线程已完成,您都必须调用join
或detach
。如果您没有,则会调用std::terminate
。
答案 1 :(得分:2)
std :: thread只是你平台本机线程库的一个薄包装......它除了一些标志和平台的原生句柄之外并没有真正包含在内部。 s线程表示(Unix和Windows都是一个奇特的整体标识符)。特别是类Unix系统,对std :: thread :: detach()的调用做了两件事:
对于线程创建可能设置的任何其他资源,当您的主线程退出时,应由平台的运行时清理这些资源。
所以,换句话说,std :: thread :: detach只允许销毁包装器而不抛出异常;在线程的主要功能退出后,线程的执行上下文中会发生实际线程的堆栈和OS资源回收,这应该是100%自动的。