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).
idz*_*idz 16
pthread_detach只是意味着你永远不会再次加入该主题.这允许pthread库知道一旦线程退出(分离的情况)它是否可以立即处置线程资源,或者它是否必须保留它们,因为您可能稍后调用pthread_join该线程.
一旦主要返回(或退出),操作系统将收获所有线程并破坏您的进程.
pthread_detach不按照您的想法执行操作 - 它向实现指示具有指定ID的线程正在使用的空间可以在它终止后立即回收,即.不会pthread_join对它进行任何操作.
一旦包含它们的进程终止,所有线程都将终止.