C语言中pthread_exit和pehread_join的使用
pthread_exit:
在线程中禁止调用exit函数,否则会导致整个进程退出,取而代之的是调用pthread_exit函数,这个函数只会使一个线程退出,如果主线程使用pthread_exit函数也不会使整个进程退出,不会影响其他线程的执行
函数原型:void pthread_exit(void *retval);
函数参数:retval通常传NULL
注意:pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者使用nalloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回指针时,这个线程函数已经退出了,栈空间会被回收
通过以下代码我们可以发现子线程执行exit会让整个进程结束。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include <pthread.h> void *mythread(void *arg) { printf("child thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self()); exit(0); } int main() { //int pthread_create(pthread_t *thread, const pthread_attr_t *attr, // void *(*start_routine) (void *), void *arg); pthread_t thread; int ret=pthread_create(&thread,NULL,mythread,NULL); if(ret!=0) { printf("pthread_create error:[%s]\n",strerror(ret)); return -1; } sleep(1);//让子线程先执行 printf("father thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self()); }
可以发现主线程并没有执行
通过以下代码可以发现主线程执行pthread_exit函数后,子线程还可以执行:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include <pthread.h> void *mythread(void *arg) { sleep(1);//保证主线程先执行 printf("child thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self()); } int main() { //int pthread_create(pthread_t *thread, const pthread_attr_t *attr, // void *(*start_routine) (void *), void *arg); pthread_t thread; int ret=pthread_create(&thread,NULL,mythread,NULL); if(ret!=0) { printf("pthread_create error:[%s]\n",strerror(ret)); return -1; } printf("father thread,pid==[%d],id==[%ld]\n",getpid(),pthread_self()); pthread_exit(NULL); }
pthread_join函数:
函数作用:阻塞等待线程退出,获取线程退出状态。其作用跟进程的waitpid()函数相似
函数原型:int pthread_join(pthread_t thread, void **retval);
函数返回值:
- 成功返回0;
- 失败返回错误号;
函数参数:
thread:线程id
retval:存储线程结束状态,整个指针和pthread_exit的参数是同一块内存地址
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include <pthread.h> void *mythread(void *arg) { int *p=(int *)malloc(sizeof(int));(或者用全局变量) *p=9; printf("child thread,id==[%ld],add==[%p]\n",pthread_self(),p); pthread_exit(p); } int main() { //int pthread_create(pthread_t *thread, const pthread_attr_t *attr, // void *(*start_routine) (void *), void *arg); pthread_t thread; int ret=pthread_create(&thread,NULL,mythread,NULL); if(ret!=0) { printf("pthread_create error:[%s]\n",strerror(ret)); return -1; } // int pthread_join(pthread_t thread, void **retval); void *pt=malloc(sizeof(void)); pthread_join(thread,&pt); int n=*(int *)pt; printf("child exit status:[%d],add==[%p]\n",n,pt); }
可以发现p和pt的地址是一样的 ,pt存储了线程结束状态
到此这篇关于java中pthread_exit和pehread_join函数的使用的文章就介绍到这了,更多相关java pthread_exit pehread_join函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
最新评论