开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:Phtead_join 线程等待】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11060
Phtead_join 线程等待
内容介绍
一、回顾
二、前景提要
三、线程等待
四、验证
一、回顾
Thread_fun1和therad_fun2遗漏了返回值,该线程函数返回指针,在待返回值的下面添加return null,暂且返回空指针。当执行ruturn 的时候,在主线程中,可以拿到线程的返回值。
二、前景提要:
1.在之前的代码中,在main函数中创建2个pthread_create线程,并且在后方添加while(1);如果没有这句话,那么main函数结束,进程结束,线程也终止。
2.可以通过while(1)来进行等待线程的结束,类似于学进程的时候的wait,wait有两个功能,阻塞,等待子进程结束,第二个功能,当子进程退出的时候,回收子进程资源。
在线程当中也有类似函数,叫做pthread_join,类似于进程中的wait。
三、线程等待
1.Int pthread_join(pthread_t thread,void**retval);第一个参数代表等待哪一个子进程结束,等待线程结束,第二个参数代表指针的指针。
定义一个void*类型的变量,取地址传进去,Void**地址保存了该线程的返回值。
2. 功能:
等待子线程结束,并回收子线程资源。
3. 参数:
thread:被等待的线程号。
rerval:用来存储线程退出状态的指针的地址。
4. 返回值:成功返回0,失败返回非0;
四、验证
将刚才的代码中的while(1),改为ret=pthread_join(tid1,&tmp),并且定义void* tmp;
return 中的null,就会被保存在temp*类型的指针里面。要想改变tmp的值,必须更改tmp的 地址,将来就是*加地址,给tmp赋值。Tmp就保存了线程的返回值。不想保存存null即可。
成功返回0,失败返回非0,将程序补充完整。
if(ret!=0){
Perror(“pthread_join”);
Return 0;
}
以上则为有两个pthread_join等线程1和线程2。
在控制台输入./pthead可以成功输出100和hello world。
例2:
验证pthread_join的第二个参数是否是线程的返回值。
将while(1)改为for循环,并定义变量i和*str=“hello wold”,返回值由null改为str。
在进程结束前打印返回值,添加一句话:printf(“thread 1 end return:%s/n”,(char *)tmp);,以此来验证&tmp能否或者线程返回值。
运行查看结果,发现真的获取到了返回值:hello world,验证成功。