编程语言
首页 > 编程语言> > C++11多线程中的detach()、join()、joinable()

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
}

标签:11,joinable,多线程,join,主线,t1,调用,线程,detach
来源: https://blog.csdn.net/datase/article/details/111595362