join & detach
join和detach为最基本的用法,join可以使主线程(main函数)等待子线程(自定义的function_1函数)完成后再退出程序,而detach可以使子线程与主线程毫无关联的独立运行,当主线程执行完毕后直接退出程序,不管子线程是否执行完毕。
#include<iostream>
#include<thread>
using namespace std;
// 子线程函数
void function_1()
{
for(int i=10;i>0;i--) // 循环10次输出
cout << "=============Hello=============" << endl;
}
int main()
{
thread t1(function_1);//线程开始
//t1.join();//方式1:结合(等待其完成)
t1.detach();//方式2:分离(使其自行运行)(cout未来得及输出完毕,主线程已结束)
cout << "~~~~~~~~~~~World~~~~~~~~~~~" << endl;
if (t1.joinable())
{
t1.join();
}
return 0;
}
detach方法的执行结果如下,可以看出子线程没来得及执行完毕。
=============Hello=============
~~~~~~~~~~~World~~~~~~~~~~~
=请按任意键继续. . .
如果换成join方法,则可以输出10条Hello语句。
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
~~~~~~~~~~~World~~~~~~~~~~~
请按任意键继续. . .
try-catch异常捕获机制的使用
join可以使某些比较重要的函数执行完毕后再退出,但当程序出现异常时,程序仍会直接退出,join没有起到应有的作用,这是可以通过try-catch异常捕获机制,结合join方法,使某些函数(子线程)在程序出现异常时也能先执行完毕再退出,例子如下,通过OpenCV读取显示一张不存在的图片产生异常。
#include<iostream>
#include<thread>
#include<opencv2/opencv.hpp>
// 子线程函数