1. 基础知识

  默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该被显示回收,即调用pthread_join,或通过调用pthread_detach函数被分离。

  1)如果一个可结合线程运行结束但没有被join,则它的状态类似与僵尸进程。

  2)若调用pthread_join后,该线程还没有结束运行,调用者会被阻塞。为了避免此现象,可在子线程中加入代码

   pthread_detach(pthread_self())

或者父线程调用

   pthread_detach(thread_id)(非阻塞,可立即返回)

这将该子线程的状态设置为分离的(detached),如此一来,该线程运行结束后会自动释放所有资源。


2.代码实现

  //detach.c
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<pthread.h>
  4 
  5 void* thread_run(void* val)
  6 {
  7     pthread_detach(pthread_self());
  8     printf("%s\n",(char*)val);
  9     return NULL;
 10 }
 11 int main()
 12 {
 13     pthread_t tid;
 14     int tret=pthread_create(&tid,NULL,thread_run,"thread_run run...");
 15     if(tret!=0) 
 16     {
 17         printf("create pthread error!,info is:%s\n",strerror(tret));
 18         return tret;
 19     } 
 20     int ret;
 21     sleep(1); 
 22     if(0==pthread_join(tid,NULL)) 
 23     {
 24         printf("thread wait success!\n");
 25         ret=0;
 26     }
 27     else
 28     {
 29         printf("pthread wait failed!\n");
 30         ret=1;
 31     }
 32     return ret;
 33 }
 
 //makefile
  1 detach:detach.c
  2     gcc -o $@ $^ -lpthread
  3 .PHONY:clean
  4 clean:
  5     rm -f detach

输出结果:

wKioL1cXONGg00TWAAAmyUMtsXg216.png