[英]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.