3.4连接已终止的线程

/*
    #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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值