1. 程式人生 > >執行緒的join 和detach狀態

執行緒的join 和detach狀態

在任何一個時間點上,執行緒是可結合的(joinable),或者是分離的(detached)。一個可結合的執行緒能夠被其他執行緒收回其資源和殺死;在被其他執行緒回收之前,它的儲存器資源(如棧)是不釋放的。相反,一個分離的執行緒是不能被其他執行緒回收或殺死的,它的儲存器資源在它終止時由系統自動釋放。

        執行緒的分離狀態決定一個執行緒以什麼樣的方式來終止自己。在預設情況下執行緒是非分離狀態的,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread_join()函式返回時,建立的執行緒才算終止,才能釋放自己佔用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。程式設計師應該根據自己的需要,選擇適當的分離狀態。所以如果我們在建立執行緒時就知道不需要了解執行緒的終止狀態,則可以pthread_attr_t結構中的detachstate執行緒屬性,讓執行緒以分離狀態啟動。

設定執行緒分離狀態的函式為pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二個引數可選為PTHREAD_CREATE_DETACHED(分離執行緒)和 PTHREAD _CREATE_JOINABLE(非分離執行緒)。這裡要注意的一點是,如果設定一個執行緒為分離執行緒,而這個執行緒執行又非常快,它很可能在pthread_create函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這樣呼叫pthread_create的執行緒就得到了錯誤的執行緒號。要避免這種情況可以採取一定的同步措施,最簡單的方法之一是可以在被建立的執行緒裡呼叫pthread_cond_timewait函式,讓這個執行緒等待一會兒,留出足夠的時間讓函式pthread_create返回。設定一段等待時間,是在多執行緒程式設計裡常用的方法。但是注意不要使用諸如wait()之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。

另外一個可能常用的屬性是執行緒的優先順序,它存放在結構sched_param中。用函式pthread_attr_getschedparam和函式pthread_attr_setschedparam進行存放,一般說來,我們總是先取優先順序,對取得的值修改後再存放回去。

執行緒等待——正確處理執行緒終止

#include <pthread.h>

void pthread_exit(void *retval);

void pthread_join(pthread_t th,void *thread_return);//掛起等待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 狀態,從而讓作業系統在該執行緒結束時來回收它所佔的資源。將一個執行緒設定為detached 狀態可以通過兩種方式來實現。一種是呼叫 pthread_detach() 函式,可以將執行緒 th 設定為 detached 狀態。另一種方法是在建立執行緒時就將它設定為 detached 狀態,首先初始化一個執行緒屬性變數,然後將其設定為 detached 狀態,最後將它作為引數傳入執行緒建立函式 pthread_create(),這樣所創建出來的執行緒就直接處於 detached 狀態。

建立 detach 執行緒:

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() 函式來對其進行資源回收。

http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htm