C++11多线程中的detach()join()joinable()

Posted 软件工程小施同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11多线程中的detach()join()joinable()相关的知识,希望对你有一定的参考价值。

一.传统多线程编写:


一般来说,我们在主线程中开辟出一些子线程来完成我们的任务,正常情况下,需要在主线程的最后调用join(),用于阻塞主线程,避免主线程先于其他子线程执行完毕,退出,然后导致整个进程的异常.

join():阻塞主线程,主线程等待其他子线程执行完毕,一起退出.


二.非传统多线程编写: 引入detach()


有人说,我们创建多个线程完成一些任务,不过需要主线程最后等待所有的子线程完毕才能退出,这样不好,主线程不自由.
所以,detach()应运而生,希望主线程可以正常的退出, 子线程被挪到后台运行,这些子线程会被C++运行时库接管,当这些子线程运行完毕后,由运行时库清理线程相关的资源, 即就是守护线程.

detach():会使线程失去我们的控制,但是如果希望子线程做的事情与我们控制与否不影响,那么
就可以使用detach(),因为子线程会跑到后台运行.
一旦调用了detach,就不要调用join,否则系统发生异常.
  1 #include<iostream>
  2 #include<thread>
  3 using namespace std;
  4 
  5 void thread_callback()
  6 {
  7     cout<<"这是子线程运行的函数"<<endl;
  8 }
  9 
 10 int main()
 11 {
 12     thread t1(thread_callback);
 13     t1.detach();
 14     //执行到该函数,t1子线程将和主线程分离.即就是t1将在后台运行
 15     //主线程不会和运行join一样在这里阻塞,而是正常退出                                                                                                              
 16     return 0;
 17 }

三.join() 和 joinable()

用来判断是否能够调用join()或者detach(),可以返回true,不可以返回false.
注意同一个线程不能同时调用jion()和detach().

//...exa
thread t1(fun);
if (t1.joinable() )
{	
	//ok to call join/detach
	t1.join()
	//t1.detach()
}
else
{
	//do something
}


————————————————
版权声明:本文为CSDN博主「KingOfMyHeart」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KingOfMyHeart/article/details/96481709

以上是关于C++11多线程中的detach()join()joinable()的主要内容,如果未能解决你的问题,请参考以下文章

C++11多线程,线程对象(thread对象)joinable()join()detach()左值智能指针

C++11多线程运行报错:terminate called without an active exception(没有join或detach子线程)

C++11多线程运行报错:terminate called without an active exception(没有join或detach子线程)

❥关于C++之多线程┆<thread>join()detach()

C++11 多线程

c++多线程在异常环境下的等待