pthread_exit函数
将单个线程退出
void pthread_exit(void *retval); 参数:retval表示线程退出状态,通常传NULL
思考:使用exit将指定线程退出,可以吗? 【pthrd_exit.c】
结论:线程中,禁止使用exit函数,会导致进程内所有线程全部退出。
在不添加sleep控制输出顺序的情况下。pthread_create在循环中,几乎瞬间创建5个线程,但只有第1个线程有机会输出(或者第2个也有,也可能没有,取决于内核调度)如果第3个线程执行了exit,将整个进程退出了,所以全部线程退出了。
所以,多线程环境中,应尽量少用,或者不使用exit函数,取而代之使用pthread_exit函数,将单个线程退出。任何线程里exit导致进程退出,其他线程未工作结束,主控线程退出时不能return或exit。
另注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
【练习】:编写多线程程序,总结exit、return、pthread_exit各自退出效果。
return:返回到调用者那里去。
pthread_exit():将调用该函数的线程
exit: 将进程退出。
/*** exit.c ***/ #include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h> void *thrd_func(void *arg) { printf("th thread: thread id = %lu, pid = %u ",pthread_self(),getpid()); return NULL; } int main() { pthread_t tid; int ret,i; // for(i = 0; i < 5; i++) { ret = pthread_create(&tid,NULL,thrd_func,(void *)&i); if(0 != ret) { fprintf(stderr,"pthread_create error:%s ",strerror(ret)); exit(1); } } printf("In main2: thread id = %lu,pid = %u ",pthread_self(),getpid()); pthread_exit((void*)1); }
运行结果:
ubuntu1604@ubuntu:~/wangqinghe/linux/20190819$ ./exit
In main2: thread id = 139958373693184,pid = 12073
th thread: thread id = 139958365353728, pid = 12073
/*** tfn.c ***/ #include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> #include<pthread.h> void *tfn(void *arg) { int i = *((int*)arg); printf("%dth thread: thread id = %lu, pid = %u ",i+1,pthread_self(),getpid()); return NULL; } int main() { pthread_t tid; int ret,i; for(i = 0; i < 5; i++) { ret = pthread_create(&tid,NULL,tfn,(void *)&i); if(0 != ret) { fprintf(stderr,"pthread_create error:%s ",strerror(ret)); exit(1); } } printf("In main2: thread id = %lu,pid = %u ",pthread_self(),getpid()); pthread_exit(NULL); }
ubuntu1604@ubuntu:~/wangqinghe/linux/20190819$ ./tfn
In main2: thread id = 140606869358336,pid = 12102
6th thread: thread id = 140606827448064, pid = 12102
6th thread: thread id = 140606835840768, pid = 12102
6th thread: thread id = 140606844233472, pid = 12102
6th thread: thread id = 140606861018880, pid = 12102
6th thread: thread id = 140606852626176, pid = 12102