1、void  pthread_exit(void *reval);表示退出当前线程,对其他线程没有影响;如果想要主线程退出而子线程不退出,就用pthread_exit函数;

  参数:退出值,如果没有退出值填NULL;

2、int pthread_join(pthread_t thread,void **retval) 阻塞等待回收线程,避免僵尸线程;

  参1:待回收的线程id;
  参2:传出参数。回收那个线程的退出值,根据pthread_exit函数里面的参数参数类型是void *,对其回收就得是void**。
  返回值:成功返回 0 ,失败返回errno;

3、int pthread_cancel(pthread_t thread) ;杀死一个线程。但需要达到一个取消点。这个取消点就是进入内核,如果线程中没有进入内核的契机,该函数就杀不死这个线程。可以在程序中手动添加一个取消点pthread_testcancel();

  参数:thread 待杀死的线程id
  返回值:成功返回0;失败返回errno
  成功被这个函数杀死的线程,使用pthrad_join回收会返回-1

4、int pthread_detach(pthread_t thread); 线程分离,分离的线程就不用回收,残留资源自动回收,可以避免僵尸线程;

  参数:待分离的线程id;
  返回值:成功返回0 失败返回errorno;
  如果调用了detach函数,就不能调用join回收;

 

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<pthread.h>
  5 void *func1(void*arg)
  6 {
  7     return (void *)11;
  8 }
  9 void *func2(void *arg)
 10 {
 11     while(1)
 12     {
 13         printf("i am pthread\n");
 14         sleep(1);
 15     }
 16     return (void *)22;
 17 
 18 }
 19 void *func3(void *arg)
 20 {
 21     //退出本线程,退出值为33
 22     pthread_exit((void *)33);
 23 }
 24 int main()
 25 {
 26     pthread_t tid;
 27     void  *val;
 28     pthread_create(&tid,NULL,func1,NULL);
 29     pthread_join(tid,&val);  //阻塞等待回收
 30     printf("return whit %d\n",(int)val);//11
 31 
 32     pthread_create(&tid,NULL,func2,NULL);
 33     sleep(2);
 34     pthread_cancel(tid);
 35     //被cancle杀死的线程不会被正常回收
 36     pthread_join(tid,&val);
 37     printf("return with %d\n",(int)val);//-1
 38 
 39     pthread_create(&tid,NULL,func3,NULL);
 40     pthread_join(tid,&val);
 41     printf("return with %d\n",(int)val);//33
 42     return 0;