是否需要分离 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() 函数应指示实现 线程线程的存储可以在该线程时被回收 终止

如果没有detachjoin 一个joinable 线程,可能会造成资源浪费

【讨论】:

删除了我的答案,你的更好。 如果将线程设置为分离的,线程的资源将在线程完成工作时被释放。 Join 用于加入线程(如果您在 main 中的某个线程上进行 join,main 将不会完成执行,直到线程终止并释放其资源)。 joindetach 用于不同的目的。但是它们都释放了资源。Detach 不是为了终止线程,线程会自行终止。Detached 意味着没有人在等待线程终止。 (就像在join中一样,有人在等待线程终止以便可以加入 也可以在这里查看this 讨论 @Dworza 也阅读this 链接以了解分离线程 @Dworza:对于那些不阅读长手册页的人:pthread_detach() 确实释放任何资源或终止任何东西。它只是将线程配置为在最终结束时释放其所有资源。

以上是关于是否需要分离 pthread 以防止内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pthread 会导致内存泄漏

绑定会在 WPF 中造成内存泄漏吗?

pthread_create() 和内存泄漏

使用 pthread_create 时出现 valgrind 内存泄漏错误

在 useEffect 挂钩中取消所有异步/等待任务以防止反应中的内存泄漏的正确方法是啥?

防止 WPF 中的内存泄漏