標籤:
轉自:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htm
線程的分離與結合
在任何一個時間點上,線程是可結合的(joinable),或者是分離的(detached)。一個可結合的線程能夠被其他線程收回其資源和殺死;在被其他線程回收之前,它的儲存空間資源(如棧)是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的儲存空間資源在它終止時由系統自動釋放。
設定線程分離狀態的函數為pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二個參數可選為PTHREAD_CREATE_DETACHED(分離線程)和 PTHREAD _CREATE_JOINABLE(非分離線程)。這裡要注意的一點是,如果設定一個線程為分離線程,而這個線程運行又非常快,它很可能在pthread_create函數返回之前就終止了,它終止以後就可能將線程號和系統資源移交給其他的線程使用,這樣調用pthread_create的線程就得到了錯誤的線程號。要避免這種情況可以採取一定的同步措施,最簡單的方法之一是可以在被建立的線程裡調用#include <pthread.h>
void pthread_exit(void *retval);
th結束,*thread_return=retval;
int pthread_detach(pthread_t th);
如果線程處於joinable狀態,則只能只能被建立他的線程等待終止。
在Linux平台預設情況下,雖然各個線程之間是相互獨立的,一個線程的終止不會去通知或影響其他的線程。但是已經終止的線程的資源並不會隨著線程的終止而得到釋放,我們需要調用 pthread_join() 來獲得另一個線程的終止狀態並且釋放該線程所佔的資源。(說明:線程處於joinable狀態下)
調用該函數的線程將掛起,等待 th 所表示的線程的結束。 thread_return 是指向線程 th 傳回值的指標。需要注意的是 th 所表示的線程必須是 joinable 的,即處於非 detached(游離)狀態;並且只可以有唯一的一個線程對 th 調用 pthread_join() 。如果 th 處於 detached 狀態,那麼對 th 的 pthread_join() 調用將返回錯誤。
如果不關心一個線程的結束狀態,那麼也可以將一個線程設定為 detached 狀態,從而讓作業系統在該線程結束時來回收它所佔的資源。 pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, THREAD_FUNCTION, arg);
總之為了在使用 pthread 時避免線程的資源線上程結束時不能得到正確釋放,從而避免產生潛在的記憶體流失問題,在對待線程結束時,要確保該線程處於 detached 狀態,否著就需要調用 pthread_join() 函數來對其進行資源回收。
(轉)linux多線程,線程的分離與結合