執行緒的分離狀態

2021-07-24 15:49:44 字數 1228 閱讀 2820

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。

執行緒的預設屬性,一般是非分離狀態,

這種情況下,原有的執行緒等待建立的執行緒結束。

只有當pthread_join()函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。

而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。

程式設計師應該根據自己的需要,選擇適當的分離狀態。

關於分離執行緒的一種用法**)

講到分離執行緒,先得從殭屍程序講起(抱歉,確實不知道執行緒是否有殭屍一說)。

關於殭屍程序:一般情況下程序終止的時候,和它相關的系統資源也並不是主動釋放的,而是進入一種通常稱為「殭屍」(zombie)的狀態。它所占有 的資源一直被系統保留,直到它的父程序(如果它直接的父程序先於它去世,那麼它將被init程序所收養,這個時候init就是它的父程序)顯式地呼叫 wait系列函式為其「收屍」。為了讓父程序盡快知道它去世的訊息,它會在它死去的時候通過向父程序傳送sigchld訊號的方式向其「報喪」。

所以一旦父程序長期執行,而又沒有顯示wait或者waitpid,同時也沒處理sigchld訊號,這個時候init程序,就沒辦法來替子程序來收屍。這個時候,子程序就真的成了」殭屍「了。

同理:如果乙個執行緒呼叫了這個函式,那麼當這個執行緒終止的時候,和它相關的系統資源將被自動釋放,系統不用也不能用pthread_join()等待其退 出。有的時候分離執行緒更好些,因為它潛在地減少了乙個執行緒**的同步點,並且pthread_join()這個api確實也是相當地難用。

為了讓主線程省去去子執行緒收屍的過程,可以使用

int pthread_detach(pthread_t thread);

來讓子執行緒處於分離狀態,就不需要父執行緒再pthread_join了。

我們來看一種分離執行緒的用法。上次別人問道一種情況,我發現必須要分離子執行緒:

void* task1(void*);

void usr();

int p1;

int main()

void usr()

}void* task1(void *arg1)

pthread_exit();

}我 們看到,在這裡task1這個執行緒函式居然會多次呼叫其父執行緒裡的函式,顯然usr函式裡,我們無法等待task1結束,反而task1會多次呼叫 usr,一旦我們在usr裡pthread_join,則在子執行緒退出前,有多個usr函式會等待,很浪費資源。所以,此處,將task1設定為分離執行緒 是一種很好的做法。

執行緒的分離狀態

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當 pthread join 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己運 行結束了,...

執行緒的分離狀態

執行緒的分離狀態決定乙個執行緒以什麼樣的方式來終止自己。執行緒的預設屬性,一般是非分離狀態,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread join 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止...

執行緒的分離狀態

執行緒的分離狀態是執行緒的一種屬性,執行緒的屬性結構為 typedef struct int detachstate 分離狀態 int schedpolicy 排程策略 structsched param schedparam 排程引數 int inheritsched 執行緒繼承性 int sco...