pthread_detach问题

时间:2011-05-18 10:06:48

标签: c linux multithreading pthreads

直到最近,我的印象是如果你在产生线程后“分离”一个线程,那么线程会在“主”线程终止后生存。

但是一个小实验(如下所列)违背了我的观点。我希望分离的线程继续打印“从分离的线程说话”,即使在主要终止之后,但这似乎并没有发生。该应用程序显然终止了......

“主要”问题返回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;
}

5 个答案:

答案 0 :(得分:34)

引用Linux Programmer's Manual

  

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

同样来自Linux Programmer's Manual

  

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

答案 1 :(得分:15)

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

一旦主要返回(或退出),操作系统将收获所有线程并破坏您的进程。

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

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

来自man pthread_detach

的NOTES部分
  

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

答案 4 :(得分:0)

来自man pthread_detach

  

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