執行緒的分離與結合
在任何乙個時間點上,執行緒是可結合的(
joinable
),或者是分離的(
detached
)。乙個可結合的執行緒能夠被其他執行緒收回其資源和殺死;
在被其他執行緒**之前,它的儲存器資源(如棧)是不釋放的。相反,乙個分離的執行緒是不能被其他執行緒**或殺死的,它的儲存器資源在它終止時由系統自動釋放。
執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己
。在上面的例子中,我們採用了執行緒
的預設屬性,即為非分離狀態(即可結合的,
joinable
,需要**)
,這種情況下,原有的執行緒等待建立的執行緒結束;只有當
pthread_join
()函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。程式設計師應該根據自己的需要,選擇適當的分離狀態。
設定執行緒分離狀態的函式為
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
進行存放,一般說來,我們總是先取優先順序,對取得的值修改後再存放回去。
4)執行緒等待——正確處理執行緒終止
#include
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);
總之為了在使用 p
detached
狀態,否著就需要呼叫
pthread_join()
函式來對其進行資源**。
執行緒的分離與結合
執行緒是可結合或分離的。乙個可結合的執行緒能夠被其他執行緒收回資源和殺死。相反,乙個分離的執行緒是不能被其他執行緒收回或殺死的,它的儲存器資源在它終止時由系統自動釋放。預設情況下,執行緒被建立為可結合的。執行緒分離函式 int pthread detach pthread t thread 由於呼叫...
Linux 執行緒的分離與結合
在開始執行緒部分內容前,我想還是先把這個概念丟擲來,否則在開始 執行緒的建立 屬性 中會有部分內容不太清楚。原理簡述 在任何乙個時間點上,執行緒是可結合的 joinable 或者是分離的 detached 執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。在預設情況下執行緒是非分離狀態的。在這...
Linux多執行緒,執行緒的分離與結合
2 執行緒的分離與結合 在任何乙個時間點上,執行緒是可結合的 joinable 或者是分離的 detached 乙個可結合的執行緒能夠被其他執行緒收回其資源和殺死 在被其他執行緒 之前,它的儲存器資源 如棧 是不釋放的。相反,乙個分離的執行緒是不能被其他執行緒 或殺死的,它的儲存器資源在它終止時由系...