什么时候应该使用std :: thread :: detach?

有时我必须使用std::thread来加速我的应用程序。 我也知道join()等待一个线程完成。 这很容易理解,但调用detach()和不调用它有什么区别?

我认为没有detach() ,线程的方法将独立工作使用一个线程。

不分离:

 void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called without detach"); }); //some code here } 

呼叫与分离:

 void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called with detach"); }); t.detach(); //some code here } 

std::thread的析构函数中, std::terminate被调用,如果:

  • 该线程没有join(与t.join()
  • 并没有分离(用t.detach()

因此,在执行stream到达析构函数之前,您应该总是joindetach一个线程。


当程序终止时(即main返回),在后台执行的剩余的分离线程不被等待; 而是它们的执行被挂起,并且它们的线程本地对象被破坏。

至关重要的是,这意味着这些线程的堆栈没有被解开 ,因此一些析构函数没有被执行。 根据这些破坏者应该采取的行动,这可能是一个糟糕的情况,就像程序崩溃或被杀害一样。 希望操作系统能够释放对文件的锁等等,但是你可能会损坏共享内存,半写文件等等。


那么,你应该使用join还是detach

  • 使用join
  • 除非你需要更多的灵活性,并且愿意提供一个同步机制来等待自己的线程完成,在这种情况下你可以使用detach

如果不等待线程完成join ,则应该调用detach ,但线程将继续运行直到完成,然后终止,而不需要主线程专门等待它。

detach基本上会释放所需的资源才能够实现join

分离线程时,意味着在退出main()之前不必join() main()

线程库实际上将等待每个这样的线程在主要 ,但你不应该关心它。

当你有一个任务必须在后台完成时, detach()主要是有用的,但是你不关心它的执行。 这通常是一些图书馆的情况。 他们可能会默默地创build一个后台工作者线程,并将其分离,所以你甚至不会注意到它。