1 #include <QCoreApplication> 2 #include <iostream> 3 #include <thread> 4 5 6 /* 7 * 话题:join() 如果打算等待对应线程,则需要细心挑选调用join()的位置。 8 * 当在线程运行之后产生异常,在join()调用之前抛出,就意味着这次调用会被跳过。 9 * 10 * 要避免应用被抛出的异常所终止,继而导致调用不到 join(),造成生命周期问题,需要在异常处理过程中调用join(), 11 * 12 * try/catch只能捕获轻量级的错误,所以这种方案,并非放之四海皆准。 13 * 14 * 因此,务必确定新线程中有无使用局部变量的引用,或者初始线程后有多个return分支。 15 */ 16 void hello(){ 17 std::cout<<"hello word "<<std::endl; 18 } 19 20 int main(int argc, char *argv[]) 21 { 22 QCoreApplication a(argc, argv); 23 24 std::thread t(hello); // thread t 对象 关联着新线程 25 26 try{ 27 int _b = 0; 28 int _a = 10/_b; 29 }catch(...){ 30 t.join(); //1 31 std::cout<<"exception..."<<std::endl; //没打印输出,奇怪的很 32 } 33 34 t.join(); //2 35 36 std::cout<<"no exception..."<<std::endl; 37 return a.exec(); 38 }