1

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

#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()无论在程序中使用与否,它都会显示相同的内存使用/泄漏输出。

请解释这种行为,因为我在这里读到:

pthread_join() 或 pthread_detach() 函数最终应为使用 detachstate 属性设置为 PTHREAD_CREATE_JOINABLE 创建的每个线程调用,以便可以回收与线程关联的存储。

如果我不打电话,如何回收存储pthread_join()

4

1 回答 1

1

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

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

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

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

于 2013-08-26T06:04:59.753 回答