關於分離執行緒

2021-06-10 07:07:53 字數 1289 閱讀 2002

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

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

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

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

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

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

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

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

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

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

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

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

intpthread_detach

(pthread_t thread)

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

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

void

*task1(

void*);

void

usr();

intp1;

intmain()

void

usr()

}void

*task1(

void

*arg1)

pthread_exit();}

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

關於分離執行緒

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

linux 分離執行緒

執行緒處於分離狀態後,當執行緒退出後,則有作業系統來負責系統的 建立分離狀態執行緒的方法有 2 執行緒屬性的設定函式 摘自 unix 環境高階程式設計 int makethread void fn void arg int err pthread t tid pthread attr t attr ...

linux分離執行緒

基本概念 分離執行緒的意義 個人理解在於是否需要關心執行緒的終止狀態,如果不需要,則設定為分離狀態。有兩種方法可以實現執行緒分離 1.呼叫pthread detach include int pthread detach pthread t thread 2.通過傳給pthread create函式...