1.先說下pthread_join()函數
原型:int pthread_join(pthread_t thread, void **retval);
參數:
thread:等待去回收的線程tid;
retval:默認爲NULL;
返回值: 0 成功;失敗 有對應的錯誤碼
——————————————————————————————————————
這個函數一個目的:去阻塞等待某個線程tid的結束,然後去回收它的資源;
原理:用了函數pthread_join()後,主線程會單獨創建一個線程去阻塞等待指定的線程結束;如果沒結束會一直等待着(阻塞的含義);當發現指定的線程tid結束後,會去回收那個線程的資源,防止內存泄漏;
join字面意思:也可以理解爲 該join線程負責等待把指定的進程tid加入到主進程(回收到主進程);
___________________________________________________________________________
那麼問題來了,爲什麼有有這個pthread_join()回收線程資源函數呢?
其實你在用pthread_creat()創建出線程時,這個線程有兩種狀態:joinable和unjoinable
如果你創建時是unjoinable狀態,那麼在線程返回或者exit後,系統會自動回收資源;
如果創建時是joinable狀態,那麼在線程結束後,佔用的資源並不會完全釋放,這時候就需要用pthread_join()函數去阻塞等待回收那個線程tid的資源;
當然還有一種方法: 在創建線程的時候加上一個分離:
pthread_detach( pthread_self() ); //分離自身的線程tid;你create的線程狀態就會改爲unjoinable(會自己回收資源那種)
這樣在線程結束後,分離的線程資源會被系統自己回收,
——————————————————————————————————————————————————
總結: 用pthread_creat()函數創建線程時,如果不注意去join或者detach,就很可能(或者是一定)出現內存泄漏的情況。