我在使用pthreads的C实现中有以下情况:
主线程(T1)创建另一个线程(T2),该线程等待事件。
在事件T2上,调用“树遍历” recusive 函数,该函数接收用于在Tree节点上执行的 Action 的函数指针。在遍历树期间,如果找到该节点,则触发fn指针以创建线程(T3),为该节点提供服务并通常会消失。
我观察到来自T3堆栈的巨大内存泄漏。瓦尔格朗德告诉我
==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
是T2serviceNode
是节点的功能指针。因此,最终系统耗尽了vm,并且线程创建失败,错误代码= 11(资源不足)
我的问题是,一旦T3(由
serviceNode
创建)正常退出,就不应该自动对线程堆栈进行垃圾收集,否则我会在这里丢失任何东西。 ?编辑:还是由于函数指针的触发而产生的问题?
最佳答案
在大多数pthreads实现中,线程退出时会泄漏一些内存,除非您执行以下任一操作:
或
确保执行上述操作之一。
关于c - 通过递归函数泄漏线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542964/