C pthread_分离问题

C pthread_分离问题,c,linux,multithreading,pthreads,C,Linux,Multithreading,Pthreads,直到最近,我的印象是,如果在生成一个线程之后“分离”它,该线程甚至在“主”线程终止之后仍然存在 但下面列出的一个小实验与我的想法相反。我希望分离的线程即使在主线程终止后也能继续打印“从分离的线程说话”,但这似乎没有发生。应用程序显然终止了 “主”问题返回0后,“分离的”线程是否死亡 #include <pthread.h> #include <stdio.h> void *func(void *data) { while (1) { pr

直到最近,我的印象是,如果在生成一个线程之后“分离”它,该线程甚至在“主”线程终止之后仍然存在

但下面列出的一个小实验与我的想法相反。我希望分离的线程即使在主线程终止后也能继续打印“从分离的线程说话”,但这似乎没有发生。应用程序显然终止了

“主”问题返回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;
}
#包括
#包括
void*func(void*data)
{
而(1)
{
printf(“从分离的线程说话…\n”);
睡眠(5);
}
pthread_exit(NULL);
}
int main()
{
pthread\u t句柄;
if(!pthread_create(&handle,NULL,func,NULL))
{
printf(“线程创建成功!!!\n”);
如果(!pthread_detach(handle))
printf(“线程已成功分离!!!\n”);
}
睡眠(5);
printf(“主线程染色…\n”);
返回0;
}
引用以下内容:

分离属性仅仅是 确定系统的行为 当线程终止时;是的 不能阻止线程被删除 如果进程终止,则终止 使用
退出(3)
(如果 主线程返回)

也可从以下网址:

允许其他线程继续 执行时,主线程应 通过调用
pthread\u exit()终止
而不是退出(3)


pthread\u detach
只意味着你再也不会加入线程了。这允许pthread库知道,一旦线程退出(分离的情况),它是否可以立即处置线程资源,或者它是否必须保留这些资源,因为您以后可能会在线程上调用
pthread\u join


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

是的,分离的线程将在
返回0后死亡

man pthread_detach

分离属性仅仅是 确定系统的行为 当线程终止时;是的 不能阻止线程被删除 如果进程终止,则终止 使用出口(3)(或同等方式,如果 主线程返回)


pthread_detach
并不像您想象的那样-它向实现表明,具有指定ID的线程使用的空间可以在其终止时立即回收,即不会对其执行任何
pthread_join
操作


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

来自
man pthread\u detach

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


如果main()表示返回0(或等价地返回)pthread_exit(NULL),进程是否会终止?这只是进程的另一个线程…@puffadder:(1)主线程并不是“另一个线程”:在相当多的情况下,pthreads对主线程的处理与其他线程不同;(2)
返回0
pthread_exit()
不等价;我已经扩展了我的答案。啊哈!好了。。。我曾经在某个地方读到,pthread_exit()和return对于线程是相同的。。。这就是为什么所有的困惑!!!非常感谢您的解释。
pthread\u exit
函数和从起始函数返回的函数对于所有线程都是相同的。但是,对于进程启动时正在运行的线程,
main
不是它的启动函数。(这怎么可能?如果是,初始化全局变量的方法是什么?填写
argc
argv
的方法是什么?传递从
main
返回的值的方法是什么?)当它从main返回时,它返回到调用
main
的函数,在其他线程运行时退出主线程不是一个好主意;在任何情况下,从main()返回都会导致其他线程被终止。