pthread_create 内存泄漏?

3
每当我在程序上运行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/,他们将所有线程存储在一个数组中,然后使用for循环。但是我没有将它们全部存储在数组中,所以我尝试进行更改以使其工作。如果我做错了,请告诉我。

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个回答

5

当线程退出时,glibc不会释放线程栈;它会缓存它们以便重复使用,并在缓存达到一定大小时才修剪缓存。因此,它总是会“泄露”一些内存。


2

您可以通过使用 pthread_join 的代码并重复创建/加入过程几次来证明没有泄漏。您会发现“泄漏”的内存量不会改变,从而证明实际上没有泄漏任何内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接