我在使用pthreads的C实现中有以下场景:
主线程(T1)创建另一个等待事件的线程(T2)。
在事件T2上调用Tree Traversal recusive 函数,该函数接受一个函数指针,用于在Tree节点上执行的操作。在树遍历期间,如果找到节点,则会触发创建线程(T3)的fn指针,为节点提供服务并且通常应该消失。
我观察到来自T3堆栈的巨大内存泄漏。 Valgrind告诉我
==9251== 2,720 bytes in 20 blocks are possibly lost in loss record 142 of 157
==9251== at 0x402425F: calloc (vg_replace_malloc.c:467)
==9251== by 0x4010CDB: _dl_allocate_tls (dl-tls.c:300)
==9251== by 0x403A2E2: pthread_create@@GLIBC_2.1 (allocatestack.c:561)
==9251== by 0x80571CC: serviceNode (NodeHndlr.c:432)
==9251== by 0x804AD88: preOrderTpTraversal (treefunct.c:503)
==9251== by 0x804AE01: preOrderTpTraversal (treefunct.c:513)
==9251== by 0x804AE01: preOrderTpTraversal (treefunct.c:513)
==9251== by 0x804AE01: preOrderTpTraversal (treefunct.c:513)
==9251== by 0x8057450: serviceproc (NodeHndlr.c:519)
==9251== by 0x403996D: start_thread (pthread_create.c:300)
==9251== by 0x411AA4D: clone (clone.S:130)
这里serviceproc
是T2
serviceNode
是节点的函数指针。
因此最终系统耗尽vm并且线程创建失败,错误代码= 11(资源不足)
我的问题是,一旦T3(由serviceNode
创建)正常退出,不应该自动对线程堆栈进行垃圾回收,或者我在这里丢失了一些东西。 ?
编辑:或是由于触发了函数指针而产生的问题?
答案 0 :(得分:4)
对于大多数pthreads实现,当线程退出时,您将泄漏一些内存,除非您:
调用线程
的pthread_join()或
通过调用pthread_detach()或作为pthread_create的属性
确保您执行上述操作之一。
答案 1 :(得分:0)
你确定你的主要问题是memery泄漏吗?在我看来,你正在产生过多的线程。如果在一个名为recursivly的函数中生成一个新线程,最终可能会有数千个线程。这可能会轻易杀死您的应用程序想想每个线程堆栈所需的内存。