一.传统多线程编写:
一般来说,我们在主线程中开辟出一些子线程来完成我们的任务,正常情况下,需要在主线程的最后调用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
}