2011-05-18 43 views
12

直到最近,我的印象是,如果在產生它之後「分離」一個線程,即使在「主」線程終止之後線程仍然存在。pthread_detach問題

但是一個小實驗(下面列出)違背了我的信念。我期望分離線程繼續打印「從分離線程中講話」,即使在主要終止之後,但這似乎不會發生。應用程序顯然終止...

在「主要」問題後,「分離」線程是否死亡return 0

#include <pthread.h> 
#include <stdio.h> 

void *func(void *data) 
{ 
    while (1) 
    { 
     printf("Speaking from the detached thread...\n"); 
     sleep(5); 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    pthread_t handle; 
    if (!pthread_create(&handle, NULL, func, NULL)) 
    { 
     printf("Thread create successfully !!!\n"); 
     if (! pthread_detach(handle)) 
      printf("Thread detached successfully !!!\n"); 
    } 

    sleep(5); 
    printf("Main thread dying...\n"); 
    return 0; 
} 
+3

在其他線程運行時退出主線程並不是一個好主意;在任何情況下,從main()返回都會導致其他線程被殺害。 – MarkR 2011-05-18 11:52:14

回答

24

引述Linux Programmer's Manual

脫離的屬性僅是 確定系統當線程終止 的行爲;如果進程終止 使用exit(3)(或等效地,如果 主線程返回),則它不會阻止線程從 終止。

同樣來自Linux Programmer's Manual

要允許其他線程繼續執行 ,主線程應該 通過調用pthread_exit() 而非exit(3)終止。

+0

如果main()表示返回0(或等同)pthread_exit(NULL),過程是否會終止?這只是進程的另一個線程...... – puffadder 2011-05-18 10:15:30

+2

@puffadder:(1)主線程不是「只是另一個線程」:有很多情況下pthreads將主線程視爲與其他線程不同; (2)'return 0'和'pthread_exit()'不等價;我已經擴展了我的答案。 – NPE 2011-05-18 10:33:00

+0

啊哈!你去...我曾經在某處讀過pthread_exit()和return對於線程是一樣的......這就是爲什麼所有的困惑!非常感謝您的澄清。 – puffadder 2011-05-18 10:40:57

13

pthread_detach只是意味着你永遠不會再與線程連接。這允許pthread庫知道一旦線程退出(分離的情況)它是否可以立即處理線程資源,或者它是否必須保留它們,因爲您稍後可能會在線程上調用pthread_join

一旦主要返回(或退出)操作系統將收穫你的所有線程並摧毀你的進程。

1

是的,分離的線程將在return 0後死亡。

man pthread_detach

筆記部分脫離的屬性僅是 確定系統當線程終止 的行爲;它 不能阻止線程被 如果過程中使用退出終止 終止(3)(或當量-alently,如果 主線程返回)

3

pthread_detach不會做你認爲它 - 它向實現表明,具有指定ID的線程正在使用的空間可以在其終止時立即回收,即,將不會執行pthread_join操作。

一旦包含它們的進程終止,所有線程都會終止。

0

man pthread_detach

pthread_detach()功能標誌着線程標識的線程沾邊。當分離的線程終止時,其資源會自動釋放回系統,而不需要另一個線程與終止的線程連接。