linux線程學習

來源:互聯網
上載者:User
http://blog.chinaunix.net/uid-26983585-id-3315953.html其實在寫上一篇日誌的時候,由於我把建立線程的傳回值的判斷條件寫錯了,程式每次啟動並執行時候都是顯示建立線程失敗,我就百度了一下,有人說是桟資源不足引起的,要調用一個pthread_attr_setdetachstate()函數,當時不明白為什麼,其原理是什麼,於是又搜了一下,下文是其原理簡述:

在任何一個時間點上,線程是可結合的(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

 

linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所佔用堆棧和線程描述符(總計8K多)。只有當你調用了pthread_join之後這些資源才會被釋放。
若是unjoinable狀態的線程,這些資源線上程函數退出時或pthread_exit時自動會被釋放。

unjoinable屬性可以在pthread_create時指定,或線上程建立後線上程中pthread_detach自己,如:pthread_detach(pthread_self()),將狀態改為unjoinable狀態,確保資源的釋放。或者將線程置為joinable,然後適時調用pthread_join.

在程式運行中檢查/proc/ <pid> /maps檔案,若看到大概8K左右的很多虛擬記憶體片段,基本上可以確認是線程資源泄漏造成的300個線程後pthread_create失敗。

不知是否因為自己,先對要建立的線程做了以下屬性設定,
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

然後又線上程函數中使用
pthread_detach(pthread_self());

兩段代碼作用有衝突。

===============================================================================

pthread_detach(threadid)和pthread_detach(pthread_self())的區別應該是調用他們的線程不同,沒其他區別。

pthread_detach(threadid)函數的功能是使線程ID為threadid的線程處於分離狀態,一旦線程處於分離狀態,該線程終止時底層資源立即被回收;否則終止子線程的狀態會一直儲存(佔用系統資源)直到主線程調用pthread_join(threadid,NULL)擷取線程的退出狀態。

通常是主線程使用pthread_create()建立子線程以後,一般可以調用pthread_detach(threadid)分離剛剛建立的子線程,這裡的threadid是指子線程的threadid;如此以來,該子線程止時底層資源立即被回收;

被建立的子線程也可以自己分離自己,子線程調用pthread_detach(pthread_self())就是分離自己,因為pthread_self()這個函數返回的就是自己本身的線程ID。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.