pthread 線程有兩種狀態,joinable(非分離)狀態和detachable(分離)狀態,默認爲joinable。
joinable:當線程函數自己返回退出或pthread_exit時都不會釋放線程所用資源,包括棧,線程描述符等。
detachable:線程結束時會自動釋放資源。
引用描述:
When a joinable thread terminates, its memory resources (thread descriptor and stack) are not deallocated until another thread performs pthread_join on it. Therefore, pthread_join must be called once for each joinable thread created to avoid memory leaks.
joinable
線程執行完後不使用pthread_join的話就會造成內存泄漏。
創建一個線程默認的狀態是joinable,線程結束運行時沒有被join,則它的狀態類似於進程中的Zombie Process(殭屍進程),即還有一部分資源沒有被回收(退出狀態碼等),所以創建線程者應該調用pthread_join來等待線程運行結束,並可得到線程的退出碼,回收其資源(類似於wait,waitpid)。
但是調用pthread_join(pthread_id)後,如果該線程沒有運行結束,調用者會被阻塞,在有些情況下我們並不希望如此,比如在Web服務器中當主線程爲每個新來的鏈接創建一個子線程進行處理的時候,主線程並不希望因爲調用pthread_join而阻塞(因爲還要繼續處理之後到來的鏈接),這時可以在子線程中加入代碼
pthread_detach(pthread_self())
或者父線程調用
pthread_detach(thread_id)(非阻塞,可立即返回)
這將該子線程的狀態設置爲detached,則該線程運行結束後會自動釋放所有資源。
int pthread_detach(pthread_t tid);
作用:將非分離的線程設置爲分離線程。即通知線程庫在指定的線程終止時回收線程佔用的內存等資源。