需要分离pthread以防止内存泄漏吗?

4
在我的程序中,我使用以下方式处理新的线程:
 pthread_t thread;
 pthread_create(&thread, NULL,
            c->someFunction, (void *) fd); //where fd is ID of the thread

这个问题非常简单 - 如果我只是让someFunction运行完,那么在C++中是否需要调用某些东西,例如join或其他任何方法,以避免内存泄漏还是内存会自动释放?

1个回答

7

pthread_join的opengroup页面中得知,

pthread_join()函数提供了一种简单的机制,允许应用程序等待线程终止。线程终止后,应用程序可以选择清理线程使用的资源。例如,在pthread_join()返回后,任何应用程序提供的堆栈存储都可以被回收。

对于每个使用detachstate属性设置为PTHREAD_CREATE_JOINABLE创建的线程,最终应调用pthread_join()或pthread_detach()函数,以便可以回收与线程相关联的存储。

并且从pthread_join的man页面中得知。

未能加入可连接的线程(即未分离的线程)会产生“僵尸线程”。应避免这样做,因为每个僵尸线程都会消耗一些系统资源,当累积了足够多的僵尸线程时,将不再可能创建新的线程(或进程)。
没有类似于waitpid(-1,&status,0)的pthread函数,即“与任何终止的线程连接”。
如果您认为需要此功能,则可能需要重新考虑应用程序设计。
如果您执行pthread_detach,则: pthread_detach()函数应指示实现,当该线程终止时可以回收线程存储器
如果您不分离或连接可连接的线程,则可能会造成资源浪费。

我删除了我的答案,你的更好。 - BoBTFish
4
如果将线程标记为“分离状态”,则在线程完成工作后,线程的资源将被释放。join用于加入线程(如果在主函数中对某个线程进行加入,主函数将等待直到该线程终止并释放其资源)。joindetach用于不同的目的。但它们都会释放资源。detach不能用于终止线程,线程将自行终止。当线程处于“分离状态”时,意味着没有人等待该线程终止(就像在使用join时,有人等待该线程终止以便可以加入)。 - Suvarna Pattayil
1
请参考此处的讨论:该链接 - Suvarna Pattayil
1
@Dworza 请阅读此链接,了解有关分离线程的信息。 - Suvarna Pattayil
4
对于不想阅读冗长手册的人来说,pthread_detach()不会释放任何资源或终止任何内容。它只是配置线程,在最终结束时释放其所有资源。 - alk
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接