c - 通过递归函数泄漏线程

标签 c multithreading memory-leaks recursion pthreads

我在使用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实现中,线程退出时会泄漏一些内存,除非您执行以下任一操作:

  • 调用该线程的pthread_join()

  • 通过调用pthread_detach()或作为pthread_create
  • 的属性将线程创建为分离线程

    确保执行上述操作之一。

    关于c - 通过递归函数泄漏线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542964/

    相关文章:

    java - 当我在 Thread 对象上调用 run() 时,为什么我的 Java 程序会泄漏内存?

    c - 在 C 中退出之前使用全局指针数组进行清理

    c - 有没有办法在 C 中多次运行 execvp() 而无需递归?

    c - 在 C 中重新分配数组

    c - 如何找出用户输入包含 C 中的非 ASCII 字符

    java - 当他们说 StringBuffer 类是同步的时,到底是什么意思?该类的所有方法都声明为同步的吗?

    c++ - 为什么 Boost 原子使用中的多生产者队列是无等待的

    Java 使用多线程写入文件并不能加快执行速度

    java - StringBuilder 可能存在内存泄漏吗?

    c - 如何正确比较 C 中的字符串?