/*
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能:和一个已经终止的线程进行连接
回收子线程的资源
这个函数是阻塞函数,调用一次只能回收一个子线程
一般在主线程中使用
参数:
thread:需要回收的子线程的id
retval:接收子线程退出时的返回值
返回值:
0:成功
非0:失败,返回的错误号
*/
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>
void * callback(void *arg){
printf("child thread id : %ld\n",pthread_self());
//sleep(3);
//return NULL;
static int value = 10;//全局变量 避免局部变量因为线程退出而空间消失
pthread_exit((void *)&value);
}
int main(){
//创建一个子线程
pthread_t tid;
int ret = pthread_create(&tid,NULL,callback,NULL);
if(ret!=0){
char * errstr = strerror(ret);
printf("error : %s\n",errstr);
}
//主线程
for(int i=0;i<5;i++){
printf("%d\n",i);
}
printf("tid : %ld,main thread id : %ld\n",tid,pthread_self());
//主线程调用phread_join()回收子线程的资源
int * thread_retval;
ret = pthread_join(tid,(void **)&thread_retval);//这里用二级指针的底层原因是pthread_exit()传递的是一个一级指针想要操作一个一级指针要用二级指针
//函数callback返回的是一个指针,要想接收这个返回值需要一个指针类型。
//所以定义了 int *thread_retval去接收返回的指针。
//但是如果直接将 thread_retval传入函数pthread_join,它就是一个局部参数,当结束函数pthread_join回到主线程,thread_retval的值是不会改变的。这样起不到用thread_retval接收返回值的作用。
//要改变值,就要传递地址,所以得传&thread_retval,因为thread_retval是一个指针,而&是取地址,所以就成了**的参数类型。
if(ret!=0){
char * errstr = strerror(ret);
printf("error : %s\n",errstr);
}
printf("exit data : %d\n",*thread_retval);
printf("回收子线程资源成功\n");
//让主线程退出,当主线程退出时,不会影响其他正常运行的线程
pthread_exit(NULL);
return 0;
}
3.4连接已终止的线程
最新推荐文章于 2024-10-10 22:13:52 发布