gpt4 book ai didi

c - "reclaimation of storage"对于线程的 pthread_join() 和 pthread_detach() 是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:05 25 4
gpt4 key购买 nike

我写了一个简单的线程程序:

#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(),它都显示相同的内存使用/泄漏输出。

请在我阅读 here 时解释此行为那:

The pthread_join() or pthread_detach() function should eventually be called for every thread that is created with the detachstate attribute set to PTHREAD_CREATE_JOINABLE so that storage associated with the thread may be reclaimed.

如果我不调用 pthread_join() 如何回收存储空间

最佳答案

根据我的理解提出了两个问题。一个是为什么 valgrind 在调用或不调用 pthread_join() 时报告相同的内存泄漏,另一个是调用 pthread_join() 是如何回收的存储,如果它实际上没有释放任何内存的话。

对这两个问题的一个可能解释是,您的线程库在调用 pthread_join() 后实际上并没有释放任何内存,而是将分配的资源放入“如果我结束时可用”在未来创建另一个线程”容器。让我们将该容器称为池。下一次调用 pthread_create() 可以重新使用池中的任何资源。如果池为空,则分配新内存。

如果不调用 pthread_join(),与退出线程关联的任何资源都不会返回到池中。因此,这些资源将保持不可用,池保持为空,因此新的 pthread_create() 将为线程创建请求分配更多资源。

这意味着 pthread_join() 根本不需要释放任何内存。它可以简单地将获取的资源放入线程库维护的池中。因此,无论是否调用 pthread_join()valgrind 都会显示相同数量的“泄漏”内存。但是,内存由 pthread_join() 回收,因为它被放置在池中以供将来调用 pthread_create()

关于c - "reclaimation of storage"对于线程的 pthread_join() 和 pthread_detach() 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18437113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com