C++中的std:thread的join函数与detach() join()函数有什么区别

在声明一个std::thread对象之后都可以使鼡detach() join()和join函数来启动被调线程,区别在于两者是否阻塞主调线程

(1)当使用join()函数时,主调线程阻塞等待被调线程终止,然后主调线程回收被调线程资源并继续运行;

(2)当使用detach() join()()函数时,主调线程继续运行被调线程驻留后台运行,主调线程无法再取得该被调线程的控制权当主调线程结束时,由运行时库负责清理与被调线程相关的资源

该方法简单暴力主线程等待子進程期间什么都不能做。thread::join()会清理子线程相关的内存空间此后thread object将不再和这个子线程相关了,即thread object不再joinable了所以join对于一个子线程来说只可以被調用一次,为了实现更精细的线程等待机制可以使用条件变量等机制。

 
 
 
 
 
 
 
 
异常环境下join假设主线程在一个函数f()里面创建thread object,接着f()又调用其它函數g(),那么确保在g()以任何方式下退出主线程都能join子线程。如:若g()通过异常退出那么f()需要捕捉异常后join.
 
上面的方法看起来笨重,有个解决办法是采用RAII(资源获取即初始化)将一个thread object通过栈对象A管理,在栈对象A析构时调用thread::join.按照局部对象析构是构造的逆序栈对象A析构完成后再析构thread object。如下:
 
 
 
 
 
 
 

    
 

我要回帖

更多关于 detach() join() 的文章

 

随机推荐