/*
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
-功能:和一个已经终止了的线程进行连接
回收子线程的资源
这个函数是阻塞函数,调用一次只能回收一个子线程
一般在主线程中使用
-参数:thread 需要回收的子线程的id
retval 二级指针,接受子线程退出时的返回值
成功,返回0,失败,返回非零值,并且设置错误号
*/
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>
void* callback(void* arg){
printf("child thread : %ld.\n",pthread_self());
sleep(3);
return NULL;
}
int main(void){
pthread_t tid;
int ret = pthread_create(&tid,NULL,callback,NULL);
if(ret != 0){
char*str = strerror(ret);
printf("error : %s.\n",str);
}
for(int i = 0;i < 5;++i){
printf("%d\n",i);
}
printf("tid:%ld ,main thread : %ld.\n",tid,pthread_self());
//主线程调用 pthread_join ()来回收子线程的资源
ret = pthread_join(tid,NULL);
if(ret != 0){
char*str = strerror(ret);
printf("error : %s.\n",str);
}
printf("回收子线程资源成功!\n");
//让主线程退出,当主线程退出的时候,不会影响其他正常运行的线程。
pthread_exit(NULL);
return 0;
}
过了 3 秒才看到子线程被回收成功!
在下面这个案例当中,让子线程返回值
但是主线程得到的是随机值,
这是因为,才用局部变量存放返回值,局部变量存放在栈当中,而子线程的栈是独有的,一旦子线程挂掉以后,栈的值被回收,因此读到的是随机值。
一定要返回全局变量。
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<unistd.h>
void* callback(void* arg){
printf("child thread : %ld.\n",pthread_self());
// sleep(3);
// return NULL;
int value = 10;
pthread_exit((void*)&value);//return (void*)&value 是一致的
}
int main(void){
pthread_t tid;
int ret = pthread_create(&tid,NULL,callback,NULL);
if(ret != 0){
char*str = strerror(ret);
printf("error : %s.\n",str);
}
for(int i = 0;i < 5;++i){
printf("%d\n",i);
}
printf("tid:%ld ,main thread : %ld.\n",tid,pthread_self());
//主线程调用 pthread_join ()来回收子线程的资源
int *thread_retval ;
ret = pthread_join(tid,(void*)&thread_retval);
printf("thread_retval :%d.\n",*thread_retval);
if(ret != 0){
char*str = strerror(ret);
printf("error : %s.\n",str);
}
printf("回收子线程资源成功!\n");
//让主线程退出,当主线程退出的时候,不会影响其他正常运行的线程。
pthread_exit(NULL);
return 0;
}
为什么需要传递二级指针?
因为 join 可能需要对返回值进行改变。