線程的分離狀態

來源:互聯網
上載者:User

線程的分離狀態決定一個線程以什麼樣的方式來終止自己。
線程的預設屬性,一般是非分離狀態,
這種情況下,原有的線程等待建立的線程結束。
只有當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()
{
p1=0;
usr();               //調用這個認為是你的觸發函數
    getchar();
return 1;
}

void usr()
{
pthread_t  pid1;
pthread_attr_t attr;
/*這裡做你的事情*/
if(p1==0)
{    pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);       //因為你的線程不便於等待的關係,設定為分離線程吧    
            pthread_create(&pid1, &attr, task1, NULL);

}

}

void* task1(void *arg1)
{
p1=1;                           //讓子線程不會被多次調用
    int i=0;
printf("thread1 begin./n");
for(i=0;i<100;i++)
{
sleep(2);                  
printf("At thread1: i is %d/n",i);       
usr();                    //繼續調用
   }
pthread_exit();
}

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.