pthread_detach问题

直到最近,我的印象是,如果在产生它之后“分离”一个线程,即使在“主”线程终止之后线程仍然存在。

但是一个小实验(下面列出)违背了我的信念。 我期望分离的线程继续打印“从分离的线程说话”,即使在主要终止后,但这似乎并没有发生。 应用程序显然终止…

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

Solutions Collecting From Web of "pthread_detach问题"

引用Linux程序员手册 :

detached属性只是决定线程终止时系统的行为; 如果进程使用exit(3)终止(或者等价地,如果主线程返回),它并不阻止线程被终止。

同样来自Linux程序员手册 :

为了让其他线程继续执行,主线程应该通过调用pthread_exit()而不是exit(3)来终止。

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

一旦主要返回(或退出)操作系统将收获所有的线程和破坏你的过程。

pthread_detach不会做你认为它所做的事 – 它向实现表明,具有指定ID的线程正在使用的空间只要它终止,就可以被回收。 将不会执行任何pthread_join操作。

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

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

man pthread_detach的NOTES部分

detached属性只是决定线程终止时系统的行为; 如果进程使用exit(3)终止(或者,如果主线程返回),则不阻止线程被终止。

man pthread_detach

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