C 通过递归函数的线程堆栈泄漏

C 通过递归函数的线程堆栈泄漏,c,multithreading,memory-leaks,recursion,pthreads,C,Multithreading,Memory Leaks,Recursion,Pthreads,在使用pthreads的C实现中,我有以下场景: 主线程t1创建另一个等待事件的线程t2 在事件上,T2调用树遍历递归函数,该函数接收要在树节点上执行的操作的函数指针。在树遍历期间,如果找到节点,则会触发fn指针,该指针创建线程T3,为节点提供服务,并且通常会消失 我观察到一个巨大的内存泄漏,来自T3的堆栈。山谷告诉我 ==9251== 2,720 bytes in 20 blocks are possibly lost in loss record 142 of 157 ==9251==

在使用pthreads的C实现中,我有以下场景:

主线程t1创建另一个等待事件的线程t2

在事件上,T2调用树遍历递归函数,该函数接收要在树节点上执行的操作的函数指针。在树遍历期间,如果找到节点,则会触发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是T2 serviceNode是节点的函数指针

因此,最终系统耗尽了vm,线程创建失败,errorcode=11没有足够的资源

我的问题是,一旦serviceNode创建的T3正常退出,线程堆栈是否应该自动进行垃圾收集,或者我是否遗漏了什么


编辑:或者问题是由函数指针触发引起的

你确定你的主要问题是内存泄漏吗?在我看来,你产生的线程太多了。如果在递归调用的函数中生成一个新线程,那么最终可能会产生数千个线程。这很容易杀死您的应用程序。想想每个线程堆栈所需的内存。

您确定您的主要问题是内存泄漏吗?在我看来,你产生的线程太多了。如果在递归调用的函数中生成一个新线程,那么最终可能会产生数千个线程。这很容易杀死您的应用程序。只需考虑每个线程堆栈所需的内存。

对于大多数pthreads实现,当线程退出时,您将泄漏一些内存,除非您:

调用pthread_加入该线程

通过调用pthread_detach或作为pthread_Create的属性,将线程创建为分离的线程


确保执行上述操作之一。

对于大多数pthreads实现,当线程退出时,将泄漏一些内存,除非您:

调用pthread_加入该线程

通过调用pthread_detach或作为pthread_Create的属性,将线程创建为分离的线程


确保您执行上述操作之一。

我的框架的可行性研究表明,需要处理器线程的同时事件不超过10个。我的框架的可行性研究表明,需要处理器线程的同时事件不超过10个。创建分离的线程可以缓解问题谢谢。创建分离的线程缓解了问题。非常感谢。