是否需要分离 pthread 以防止内存泄漏?
Posted
技术标签:
【中文标题】是否需要分离 pthread 以防止内存泄漏?【英文标题】:Is it needed to detach pthread to prevent memory leaks? 【发布时间】:2013-06-05 09:24:10 【问题描述】:在我的程序中,我处理新线程
pthread_t thread;
pthread_create(&thread, NULL,
c->someFunction, (void *) fd); //where fd is ID of the thread
问题很简单 - 如果我只是让 someFunction
完成,那么是否需要在 C++
中调用某些东西,例如join
或其他任何东西,以防止 memory leaks
或内存自动释放??
【问题讨论】:
【参考方案1】:来自opengroup page for pthread_join,
pthread_join() 函数提供了一种简单的机制,允许 应用程序等待线程终止。线程之后 终止,应用程序可以选择清理资源 被线程使用。例如,在 pthread_join() 返回后, 任何应用程序提供的堆栈存储都可以回收。
pthread_join() 或 pthread_detach() 函数最终应该是 为使用 detachstate 属性创建的每个线程调用 设置为 PTHREAD_CREATE_JOINABLE 以便存储与 线程可能会被回收。
来自man page of pthread_join
未能加入可加入的线程(即,不可加入的线程) 分离),亲 引出一个“僵尸线程”。避免这样做,因为每个僵尸线程都会消耗一些 系统资源,当僵尸线程积累足够多时,就不再 可以创建新的线程(或进程)。
没有类似于 waitpid(-1, &status, 0) 的 pthreads,即“与任何 ter- 分流线程”。
如果您认为自己需要此功能,您可能需要 重新考虑您的应用程序设计。
如果你这样做pthread_detach,
pthread_detach() 函数应指示实现 线程线程的存储可以在该线程时被回收 终止
如果没有detach
或join
一个joinable
线程,可能会造成资源浪费
【讨论】:
删除了我的答案,你的更好。 如果将线程设置为分离的,线程的资源将在线程完成工作时被释放。 Join 用于加入线程(如果您在 main 中的某个线程上进行 join,main 将不会完成执行,直到线程终止并释放其资源)。join
和 detach
用于不同的目的。但是它们都释放了资源。Detach 不是为了终止线程,线程会自行终止。Detached 意味着没有人在等待线程终止。 (就像在join中一样,有人在等待线程终止以便可以加入
也可以在这里查看this 讨论
@Dworza 也阅读this 链接以了解分离线程
@Dworza:对于那些不阅读长手册页的人:pthread_detach()
确实不释放任何资源或终止任何东西。它只是将线程配置为在最终结束时释放其所有资源。以上是关于是否需要分离 pthread 以防止内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
使用 pthread_create 时出现 valgrind 内存泄漏错误