会阻塞你当前的调用线程,直到task1执行完毕。这也就是说,如果你在主线程中thread task1;后直接调用它的join方法,相当于没有开启多线程。
在这里提一下C++里多线程的知识:std::thread类在构造时就会创建一条线程并立即开始执行,并且该对象会一直处于与线程的绑定状态,直到join方法被调用或者detach方法被调用。
调用join方法,会要求调用该方法的线程等待该线程对象对应的线程执行完毕,才会继续向下执行,如果线程已经结束,则join方法会直接返回,主线程直接向下继续执行;如果调用detach方法,则会要求线程对象与线程分离。
但是为什么要分离线程对象与线程呢?这是因为,如果线程尚未停止,但线程对象却已经析构,这个线程就会在事实上失去控制,就如同没有指针指向其的内存一样,会导致未定义行为,一般编译器编译出的程序的行为是直接停止。
所以,多线程的正确使用方式是:
1. 构造线程对象,这个时候子线程就会开始执行;
2. 主线程继续构造子线程对象,或者执行一些其他的操作;
3. 当主线程操作完成时,或者主线程需要用到子线程的操作结果时,调用子线程的join方法;
|