【问题标题】:Is it needed to detach pthread to prevent memory leaks?是否需要分离 pthread 以防止内存泄漏?
【发布时间】: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 或内存自动释放??

【问题讨论】:

    标签: c++ memory-management pthreads


    【解决方案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() 确实释放任何资源或终止任何东西。它只是将线程配置为在最终结束时释放其所有资源。
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2010-09-21
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多