2012-08-09 83 views
15

我在同一個進程中遇到了有關主線程和其他線程的問題。當主函數返回時,另一個線程也退出了嗎?我有些困惑。我寫了一些測試代碼,如下所示:,還有其他出口嗎?

void* test1(void *arg) 
{ 
    unsigned int i = 0; 
    while (1){ 
     i+=1; 
    } 
    return NULL; 
} 

void* test2(void *arg) 
{ 
    long double i = 1.0; 
    while (1){ 
     i *= 1.1; 
    } 
    return NULL; 
} 

void startThread (void * (*run)(void*), void *arg) { 
    pthread_t t; 
    pthread_attr_t attr; 
    if (pthread_attr_init(&attr) != 0 
     || pthread_create(&t, &attr, run, arg) != 0 
     || pthread_attr_destroy(&attr) != 0 
     || pthread_detach(t) != 0) { 
    printf("Unable to launch a thread\n"); 
    exit(1); 
    } 
} 

int main() 
{ 
    startThread(test1, NULL); 
    startThread(test2, NULL); 

    sleep(4); 
    printf("main thread return.\n"); 

    return 0; 
} 

當「主線程返回」。放出來,線程test1和test2也退出,任何人都可以告訴我爲什麼?

+0

問題的文本與問題主體不匹配。這是關於當主線程退出時會發生什麼?或者這是關於當主線程從'main'函數返回時會發生什麼? (很顯然,如果線程退出,線程不能返回,它可以做一個或另一個。) – 2016-02-17 10:37:08

回答

9

當主線程返回時,它終止整個過程。這包括所有其他線程。當您致電exit時,會發生同樣的情況。

pthread_detach的目的是爲了讓它不需要與其他線程連接以釋放其資源。分離一個線程並不會使它在過程終止之後存在,它將與所有其他線程一起被銷燬。

+16

這個答案寫得不對。當主線程(或任何線程)調用'exit'時,或者當初始調用'main'返回時,整個過程都會退出。但是主線程可以用'pthread_exit'退出而不影響其他線程。 – 2012-08-09 06:37:57

19

您應該在每個新線程上使用pthread_join()來通知調用線程等待子線程,掛起執行 - 並退出進程 - 直到這些線程終止。

調用pthread_detach創建的線程不會在進程退出後將其保留。從linux man page

detached屬性僅僅確定線程終止時系統的行爲;如果進程使用exit(3)終止(或等價地,如果主線程返回),它不會阻止線程終止。

有時你會看到一個在main用來代替明確pthread_join電話pthread_exit,意圖是,以這種方式退出main將允許其他線程繼續運行。事實上,linux man page指出這明確:

要允許其他線程繼續執行,主線程應該調用pthread_exit終止(),而不是出口(3)。

但我不知道這是否是所有平臺上的預期行爲,並且我一直堅持使用pthread_join

pthread_join需要pthread_t目標線程,因此您的代碼將需要改變一點,因爲你需要調用pthread_join等待他們兩個之前創建兩個線程。所以你不能在startThread中叫它。您需要返回pthread_t,或者將指針傳遞給pthread_t以指向startThread函數。

+1

但是我使用pthread_detach函數來避免這種情況。 – laifjei 2012-08-09 02:35:01

+2

請仔細閱讀['pthread_detach'](http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_detach.html)的文檔。它沒有做你認爲的事情。 – pb2q 2012-08-09 02:39:23

+0

@laifjei也許你誤以爲提供的功能分離。 G。在Java/C#/ Python /等。 - 守護進程線程。 Java在內部保持進程在任何非守護線程處於活動狀態時保持活動狀態(即使主線程死亡)。 – 2017-10-17 19:30:03

相關問題