線程create、exit、join、detach,線程內存泄漏

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,就很可能(或者是一定)出現內存泄漏的情況。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章