#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
-功能:和一个已经终止的线程进行连接
回收子线程的资源,这个函数是阻塞函数,调用一次只能回收一个子线程。一般在主线程中使用
-参数:
-pthread:需要回收的子线程的ID
-retval:接收子线程退出时的返回值(二级指针)
返回值:成功:0 失败:error。
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 #include <pthread.h>
5 int val=10;//全局变量
6 void *callback(void *arg)//子线程
7 {
8 printf("child pthread:%ld\n",pthread_self());
9 // sleep(3);
10 // return NULL;
11 pthread_exit(&val);//回收val值
12 }
13 int main()
14 {
15 //创建子线程
16 pthread_t tid;
17 int ret=pthread_create(&tid,NULL,callback,NULL);
10 // return NULL;
11 pthread_exit(&val);//回收val值
12 }
13 int main()
14 {
15 //创建子线程
16 pthread_t tid;
17 int ret=pthread_create(&tid,NULL,callback,NULL);
18 if(ret!=0)
19 {
20 printf("strerror:%s\n",strerror(ret));
21 }
22 //主线程
23 for(int i=0;i<5;++i)
24 {
25 printf("%d\n",i+1);
26 }
27 printf("tid:%ld,main pthread:%ld\n",tid,pthread_self());
28 //主线程调用pthread_join()回收子进程的资源
29 int *pthread_retval;
30 int fdt=pthread_join(tid,(void **)&pthread_retval);
31 if(fdt!=0)
32 {
33 printf("strerror:%s\n",strerror(fdt));
34 }
35 printf("exit data:%d\n",*pthread_retval);//输出子线程的返回值:10
36 printf("回收子线程成功\n");
37 //让主线程退出,当主线程退出时,不会影响其他的线程正常运转
38 pthread_exit(NULL);//退出主线程前会先把子线程运行完
39 return 0;//exit(0);
40 }
运行结果为:
我们也可以在子线程设置睡眠3秒,当3秒过后就会显示:exit data:10 回收子线程成功。
觉得不错点个赞再走吧。