簡體   English   中英

關於線程的pthread_join()和pthread_detach()的“回收存儲”是什么意思?

[英]What is the meaning of “reclaimation of storage” with respect to threads' pthread_join() & pthread_detach()?

我寫了一個簡單的線程程序:

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

#define THREADS     5

void* HelloWorld(void *t) 
{
    printf("Thread ID #%lu: (%lu) Hello World !!\n", pthread_self(), (unsigned long)t);         

    return NULL;
}

int main()
{
    pthread_t thread[THREADS];
    uint32_t i;
    int err;

    for(i = 0; i < THREADS; ++i)
    {   
        err = pthread_create(&thread[i], NULL, &HelloWorld, (void*)(unsigned long long)i);
        if(err != 0)
        {   
            printf("Error %d: Thread %d Creation Unsuccessful !!\n", err, i); 
        }   
        printf("Thread %lu in main()\n", pthread_self());
    }   
/*
    for(i = 0; i < THREADS; ++i)
    {
        pthread_join(thread[i], NULL);  // Error checking implemented
    }
*/
    return 0;
}

但是在使用valgrind作為:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./hello

無論程序中是否使用pthread_join()它都會顯示相同的內存使用/泄漏輸出。

當我在這里閱讀時,請解釋這種行為:

最終應為將detachstate屬性設置為PTHREAD_CREATE_JOINABLE創建的每個線程調用pthread_join()或pthread_detach()函數,以便可以回收與該線程關聯的存儲。

如果不調用pthread_join()如何回收存儲

據我了解,有兩個問題。 一個是為什么valgrind在調用pthread_join()或不調用pthread_join()情況下報告相同的內存泄漏,另一原因是,如果pthread_join()實際上沒有釋放任何內存,則調用pthread_join()會如何回收存儲。

對這兩個問題的一種可能解釋是,您的線程庫實際上在調用pthread_join()之后並沒有釋放任何內存,而是將分配的資源放入“如果我將來要創建另一個線程時可用”容器。 讓我們將該容器稱為池。 下次對pthread_create()調用可以重新使用池中的任何資源。 如果池為空,則分配新的內存。

如果不調用pthread_join() ,則與退出線程關聯的任何資源都不會返回到池中。 因此,這些資源將保持不可用狀態,池將保持為空,因此新的pthread_create()將為線程創建請求分配更多資源。

這意味着pthread_join()不一定完全釋放任何內存。 可以簡單地將收獲的資源放入線程庫維護的池中。 因此,無論是否調用pthread_join()valgrind都將顯示相同數量的“泄漏”內存。 但是,內存被pthread_join()回收,因為它被放置在池中以供將來調用pthread_create()

暫無
暫無

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

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