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;