c/c++ linux c 多线程 pthread_detach(id); phthread_join(id,0);
pthread_join(id,0);//2
以上是多线程技术中的两个函数,我想知道的是 1,2两句同时用和只用1,有没有区别?
有什么区别? 谢谢!
注:id为子线程的线程号。 展开
有区别。
只用1可以。同时使用1,2是不可以的。
一般情况下,线程终止后,其终止状态一直会保留到其他线程调用pthread_join获取它的状态为止。但是线程也可以设置为detach状态,这样的线程一旦终止就立即回收它占用的所有资源,而不保留终止状态。
注意:
不能对已经detach状态的线程调用pthread_join。
对一个尚未detach的线程调用phread_join或phread_detach都可以把该线程设置为datach,也就是说,不能对同一线程调用两次pthread_join,或者如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。
phtread_join是阻塞式的,需要等待这个线程终止,而phread_datach是不阻塞的,所以可以用phread_datach来销毁终止线程
你说的阻塞意思是说:当主线程中调用了子线程,如果子线程启动后主线程会停止下来直到子线程完成后主线程才会运行?
是这样的,pthread_join()这个函数在多线程开发中主线程主要用来获得子线程结束的状态以便回收子线程的资源。
但是有时候会出现你调用pthread_join()后,子线程还在运作,这样调用者(调用pthread_join的者)可能就会被阻塞,这时候就可以调用
phtread_detach()
子线程非阻塞,可立即返回,这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源。
子线程中这个用
pthread_detach(pthread_self())
父线程中这么调用
pthread_detach(thread_id)//(非阻塞,可立即返回)
他们都是这将该子线程的状态设置为detached,则线程运行结束后会自动释放所有资源。