pthread_create内存泄漏?

时间:2011-09-02 00:48:45

标签: c memory-leaks pthreads

每当我在我的程序上运行valgrind时,它告诉我,无论我在哪里调用pthread_create,我都可能丢失内存。我一直在努力遵循

的指导

valgrind memory leak errors when using pthread_create http://gelorakan.wordpress.com/2007/11/26/pthead_create-valgrind-memory-leak-solved/

和谷歌给我的其他各种网站,但没有任何效果。到目前为止,我已尝试加入线程,将pthread_attr_t设置为DETACHED,在每个线程上调用pthread_detach,并调用pthread_exit()。

尝试PTHREAD_CREATE_DETACHED -

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this);
pthread_create(&drive, &attr, driving_thread, (void*)this);
pthread_create(&update, &attr, update_server_thread(void*)this);

我想我可能已经加入错误编码了下一个......我要过去了 https://computing.llnl.gov/tutorials/pthreads/ 并且它们的所有线程都在一个数组中,因此它们只是用于循环。但是我没有将它们全部放在一个数组中,所以我试着将它改成工作。如果我做错了,请告诉我。

void* status;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this);
pthread_create(&drive, &attr, driving_thread, (void*)this);
pthread_create(&update, &attr, update_server_thread(void*)this);

pthread_join(c_udp_comm, &status);
pthread_join(drive, &status);
pthread_join(update, &status);

尝试pthread_detach -

pthread_create(&c_udp_comm, NULL, udp_comm_thread, (void*)this);
pthread_create(&drive, NULL, driving_thread, (void*)this);
pthread_create(&update, NULL, update_server_thread(void*)this);

pthread_detach(c_udp_comm);
pthread_detach(drive);
pthread_detach(update);

尝试pthread_exit -

pthread_create(&c_udp_comm, NULL, udp_comm_thread, (void*)this);
pthread_create(&drive, NULL, driving_thread, (void*)this);
pthread_create(&update, NULL, update_server_thread(void*)this);

pthread_exit(NULL);

如果有人能帮助我弄清楚为什么这一切都无效,我将非常感激。

2 个答案:

答案 0 :(得分:4)

当线程退出时,glibc不会释放线程堆栈;它将它们缓存以供重用,并且只在缓存变大时才修剪它们。因此它总是“泄漏”一些记忆。

答案 1 :(得分:1)

您可以通过使用pthread_join的代码并重复创建/加入过程几次来证明没有泄漏。你会看到“泄露”的内存量没有变化,证明实际上没有内存泄露。