- 参考
https://www.cnblogs.com/jiu0821/p/6707912.html - 参考
https://www.cnblogs.com/lidabo/p/5514222.html - 死锁
https://blog.youkuaiyun.com/qq_35733751/article/details/82807881
当一个进程或线程调用了针对其它线程的pthread_join()接口,就是线程合并了。这个接口会阻塞调用进程或线程,直到被合并的线程结束为止。当被合并线程结束,pthread_join()接口就会回收这个线程的资源,并将这个线程的返回值返回给合并者。
与线程合并相对应的另外一种线程资源回收机制是线程分离,调用接口是pthread_detach()。线程分离是将线程资源的回收工作交由系统自动来完成,也就是说当被分离的线程结束之后,系统会自动回收它的资源。因为线程分离是启动系统的自动回收机制,那么程序也就无法获得被分离线程的返回值,这就使得pthread_detach()接口只要拥有一个参数就行了,那就是被分离线程句柄。
线程合并和线程分离都是用于回收线程资源的,可以根据不同的业务场景酌情使用。不管有什么理由,你都必须选择其中一种,否则就会引发资源泄漏的问题,这个问题与内存泄漏同样可怕。
线程创建时默认joinable状态,如果不显示join阻塞调用或者设置分离状态,即便线程结束返回或者pthread_exit时都不会释放线程所占用堆栈和线程描述符,造成资源泄漏。除了线程创建时设置分离参数之外,还可以detach。实现方式有两种:父线程创建完子线程后,执行pthread_detach(tid);或者,子线程代码里执行pthread_detach(pthread_self())。