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

2021-09-30 06:23:58 字數 975 閱讀 2847

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

關於殭屍程序:一般情況下程序終止的時候,和它相關的系統資源也並不是主動釋放的,而是進入一種通常稱為「殭屍」(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 函式返回時,建立的執行緒才算終止,才能釋放自己占用的系統資源。而分離執行緒沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止...

C 多執行緒一 啟動 加入 分離執行緒

c 執行緒庫啟動執行緒,可以歸結為構造std thread物件 std thread在標頭檔案 std thread 可以用可呼叫 callable 型別構造 啟動執行緒之後,要選擇結束執行緒的方式,等待執行緒結束 加入式.join 還是讓其自主執行 分離式.detach 示例 struct fun...