pthread_detach问题

puf*_*der 20 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;
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 37

引用Linux程序员手册:

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

同样来自Linux程序员手册:

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

  • @puffadder:(1)主线程不是"只是另一个线程":在很多情况下,pthreads以不同于其他线程的方式处理主线程; (2)`return 0`和`pthread_exit()`不等价; 我扩大了答案. (4认同)
  • 对于所有线程,从起始函数返回的`pthread_exit`函数是相同的.但是,对于进程启动时运行的线程,`main`是*not*它的启动函数.(怎么可能?如果是的话,什么会初始化全局变量?什么会填充`argc`和`argv`?什么会传递从'main`返回的值?)当它从main返回时,它返回到调用`main`的函数,然后继续终止进程. (4认同)
  • 如果 main() 说返回 0(或等效地)pthread_exit(NULL),进程会终止吗?这只是过程的另一个线程...... (2认同)

idz*_*idz 16

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

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


Mic*_*kis 6

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

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