赞
踩
void pthread_exit(void *retval);
/*
功能:退出当前子线程。与在某个函数中返回区别一下。
参1:retval表示线程退出状态,通常传NULL。
*/
1)测试1
下面的程序和结果可以看到,当执行到第二个线程时,我们调用了exit(0),导致后面3,4,5线程没有打印。也就是说,该函数会将整个进程退出,无论在哪个线程中。
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> int func(int a){ exit(0); } void *tfn(void *arg){ int i; i = (int)arg; sleep(i); if (i == 2){ func(8888);//测试1 //return NULL;//测试2 //func(8888);//测试3 } printf("I'm %dth thread, Thread_ID = %lu\n", i+1, pthread_self()); pthread_exit(NULL); } int main(int argc, char *argv[]){ int n = 5, i; pthread_t tid[n]; for (i = 0; i < n; i++) { tid[i] = -1; } for (i = 0; i < n; i++) { pthread_create(&tid[i], NULL, tfn, (void *)i); } //为了方便观察,不回收 //for (i = 0; i < n; i++) { //pthread_join(tid, NULL); //} printf("I am main, and I am not a process, I'm a thread!\n" "main_thread_ID = %lu\n", pthread_self()); return 0; }
程序结果:
1)测试2
同样的代码,我们将func函数中的exit改成return NULL,可以看到结果1能够依次打印。
结果1:
2)测试3
然后再将return NULL封装一下放在一个新的函数func中返回,重新调用func,可以看到结果2,我们想要退出线程3,但却没有退出。
void* func(){
return NULL;
}
结果2:
将测试3的代码改成下面,可以看到结果,线程3退出了。所以pthread_exit的作用是只退出当前子线程,记住是只。即使你放在主线程,它也会只退出主线程,其它线程有运行的仍会继续运行。
void* func(){
pthread_exit(NULL);
}
结果:
所以我们可以大总结这些退出函数的作用了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。