直到最近,我的印象是如果你在产生线程后“分离”一个线程,那么线程会在“主”线程终止后生存。
但是一个小实验(如下所列)违背了我的观点。我希望分离的线程继续打印“从分离的线程说话”,即使在主要终止之后,但这似乎并没有发生。该应用程序显然终止了......
“主要”问题返回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;
}
答案 0 :(得分:34)
仅仅是分离的属性 确定系统的行为 当线程终止时;它确实 不要阻止线程 如果进程终止则终止 使用
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
仅仅是分离的属性 确定系统的行为 当线程终止时;它确实 不要阻止线程 如果进程终止则终止 使用exit(3)(或等效,如果 主线程返回)
答案 4 :(得分:0)
来自man pthread_detach
:
pthread_detach()
函数将线程标识的线程标记为已分离。当分离的线程终止时,它的资源会自动释放回系统,而不需要另一个线程与终止的线程连接。