我遇到的情况是,我创建的可拆卸线程在退出后不会释放内存。
我尝试过以下方式创建线程
1 -
pthread_attr_setdetachstate(&pthread_attributes, PTHREAD_CREATE_DETACHED);
pthread_create(&thread_id, &pthread_attributes, establish_connection,
(void *) establish_connection_arguments);
2 -
pthread_create(&thread_id, &pthread_attributes, establish_connection,
(void *) establish_connection_arguments);
pthread_detach(thread_id);
3 -
pthread_create(&thread_id, &pthread_attributes, establish_connection,
(void *) establish_connection_arguments);
void *establish_connection(void *arguments) {
pthread_detach(pthread_self());
return NULL;
}
我确信内存仍然保留,因为pmap证实了这一点。
这是正常的行为,在线程完成后,pmap仍然会显示带有内存的线程吗?
答案 0 :(得分:0)
默认情况下,glibc / nptl缓存线程堆栈以重用它们。这会导致从缓存列表中添加/删除元素的同步成本很低,并且会产生非常重要(但希望不是很大)的内存成本,但每次调用线程时都会避免调用mmap
和munmap
的成本。创建或销毁。我不怀疑有任何方法可以在没有非常脆弱的黑客的情况下更改此默认行为。
编辑:既然你说正在发布可连接的线程,这是我的第二个猜测原因:实现很难让一个线程释放自己的堆栈,因为它没有堆栈在执行工作时运行以释放其堆栈。可以通过编写不需要堆栈的asm来立即解决munmap
系统调用,然后立即自我终止,但是我从未见过实现这样做。
答案 1 :(得分:0)
最有可能的是,空间被任何正在使用的内存分配器缓存。运行奇数线程并且没有使用内存后不会出现泄漏的迹象 - 您必须重复打开和关闭大量线程,然后检查进程内存的使用情况。
答案 2 :(得分:0)
pmap
程序正在显示进程的内存映射。该进程仍在使用该内存。例如,如果创建了另一个线程,则该内存可能会用于其堆栈。