線程的分離與結合

原文地址:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.htmlhtml

線程的分離與結合程序員

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

線程的分離狀態決定一個線程以什麼樣的方式來終止本身。在上面的例子中,咱們採用了線程的默認屬性,即爲非分離狀態(便可結合的,joinable,須要回收),這種狀況下,原有的線程等待建立的線程結束;只有當pthread_join()函數返回時,建立的線程纔算終止,才能釋放本身佔用的系統資源。而分離線程不是這樣子的,它沒有被其餘的線程所等待,本身運行結束了,線程也就終止了,立刻釋放系統資源。程序員應該根據本身的須要,選擇適當的分離狀態。多線程

設置線程分離狀態的函數爲pthread_attr_setdetachstatepthread_attr_t *attr, int detachstate)。第二個參數可選爲PTHREAD_CREATE_DETACHED(分離線程)和 PTHREAD _CREATE_JOINABLE(非分離線程)。這裏要注意的一點是,若是設置一個線程爲分離線程,而這個線程運行又很是快,它極可能在pthread_create函數返回以前就終止了,它終止之後就可能將線程號和系統資源移交給其餘的線程使用,這樣調用pthread_create的線程就獲得了錯誤的線程號。要避免這種狀況能夠採起必定的同步措施,最簡單的方法之一是能夠在被建立的線程裏調用pthread_cond_timewait函數,讓這個線程等待一下子,留出足夠的時間讓函數pthread_create返回。設置一段等待時間,是在多線程編程裏經常使用的方法。可是注意不要使用諸如wait()之類的函數,它們是使整個進程睡眠,並不能解決線程同步的問題。dom

另一個可能經常使用的屬性是線程的優先級,它存放在結構sched_param中。用函數pthread_attr_getschedparam和函數pthread_attr_setschedparam進行存放,通常說來,咱們老是先取優先級,對取得的值修改後再存放回去。函數

4)線程等待——正確處理線程終止spa

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

相關文章
相關標籤/搜索