【问题标题】:pthread_detach questionpthread_detach 问题
【发布时间】:2011-08-27 22:19:15
【问题描述】:

直到最近,我的印象是,如果您在生成线程后“分离”线程,即使在“主”线程终止后,该线程仍然存在。

但是一个小实验(如下所列)与我的看法相反。我预计即使在 main 终止后,分离的线程也会继续打印“从分离的线程说话”,但这似乎没有发生。应用程序显然终止了...

“主要”问题返回 0 后,“分离的”线程会死掉吗?

#include <pthread.h>
#include <stdio.h>

void *func(void *data)
{
    while (1)
    {
        printf("Speaking from the detached thread...\n");
        sleep(5);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t handle;
    if (!pthread_create(&handle, NULL, func, NULL))
    {
        printf("Thread create successfully !!!\n");
        if ( ! pthread_detach(handle) )
            printf("Thread detached successfully !!!\n");
    }

    sleep(5);
    printf("Main thread dying...\n");
    return 0;
}

【问题讨论】:

  • 在其他线程运行时退出主线程不是一个好主意;在任何情况下,从 main() 返回都会导致其他线程被杀死。

标签: c linux multithreading pthreads


【解决方案1】:

来自man pthread_detach

pthread_detach() 函数将线程标识的线程标记为已分离。当一个分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程加入到终止的线程中。

【讨论】:

    【解决方案2】:

    引用Linux Programmer's Manual

    只是分离的属性 确定系统的行为 当线程终止时;它确实 不阻止线程被 如果进程终止,则终止 使用exit(3)(或等效地,如果 主线程返回)。

    同样来自Linux Programmer's Manual

    允许其他线程继续 执行,主线程应该 通过调用 pthread_exit() 终止 而不是exit(3)

    【讨论】:

    • 如果 main() 说返回 0(或等效)pthread_exit(NULL),进程会终止吗?它只是进程的另一个线程......
    • @puffadder: (1) 主线程不是“只是另一个线程”:在很多情况下,pthread 将主线程与其他线程区别对待; (2)return 0pthread_exit()不等价;我已经扩展了我的答案。
    • 啊哈!你去吧......我曾经在某处读到 pthread_exit() 和 return 对于线程是相同的......这就是为什么所有的混乱!非常感谢您的澄清。
    • pthread_exit 函数和从起始函数返回对于所有线程都是相同的。但是,对于进程启动时正在运行的线程,main不是它的启动函数。 (怎么可能?如果是的话,什么会初始化全局变量?argcargv会填什么?main返回的值会传递什么?)当它从main返回时,它返回到调用main的函数,然后继续终止进程。
    【解决方案3】:

    pthread_detach 并没有按照你的想法做 - 它向实现表明具有指定 ID 的线程正在使用的空间可以在它终止后立即回收,即。不会对其执行pthread_join 操作。

    一旦包含它们的进程终止,所有线程都将终止。

    【讨论】:

      【解决方案4】:

      是的,分离的线程会在return 0之后死掉。

      来自man pthread_detach的注释部分

      只是分离的属性 确定系统的行为 当线程终止时;它确实 不阻止线程被 如果进程终止,则终止 使用 exit(3) (或等效地,如果 主线程返回)

      【讨论】:

        【解决方案5】:

        pthread_detach 只是意味着您永远不会再加入该线程。这允许 pthread 库知道它是否可以在线程退出后立即释放线程资源(分离的情况),或者是否必须保留它们,因为您以后可能会在线程上调用 pthread_join

        一旦 main 返回(或退出),操作系统将获取您的所有线程并销毁您的进程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-31
          • 2018-08-20
          • 2014-02-15
          • 2023-03-07
          • 2010-09-13
          • 1970-01-01
          相关资源
          最近更新 更多