簡體   English   中英

pthread_detach問題

[英]pthread_detach question

直到最近,我的印象是,如果你在產生線程后“分離”一個線程,那么即使在“主”線程終止之后線程仍然存在。

但是一個小實驗(如下所列)與我的觀點相反。 我希望分離的線程繼續打印“從分離的線程說話”,即使在主要終止之后,但這似乎並沒有發生。 該應用程序顯然終止了......

“主要”問題返回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;
}

引用Linux程序員手冊

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

同樣來自Linux程序員手冊

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

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

一旦主要返回(或退出),操作系統將收獲所有線程並破壞您的進程。

pthread_detach不會按照您的想法執行操作 - 它向實現指示具有指定ID的線程正在使用的空間可以在它終止后立即回收,即。 不會對它執行pthread_join操作。

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

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

man pthread_detach的NOTES部分

分離屬性僅在線程終止時確定系統的行為; 如果進程使用exit(3)終止(或等效,如果主線程返回),它不會阻止線程終止

來自man pthread_detach

pthread_detach()函數將線程標識的線程標記為已分離。 當分離的線程終止時,其資源會自動釋放回系統,而不需要另一個線程與終止的線程連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM