网络编程(35)—— 利用pthread_join函数等待线程结束并获取线程函数返回值
来源:互联网 发布:博罗县政府网络问政网 编辑:程序博客网 时间:2024/05/16 18:47
在linux中的多线程一节中,我们介绍了利用pthread_create()函数创建子线程的方法。这种方式创建的线程存在一个问题:在主线程创建完成子线程后,若子线程函数
还没结束时,但是此时主线程函数已经结束,那么子线程也会被强制销毁,为了避免这个问题,当时我们在主线程中sleep了11秒钟以等待子线程的结束。虽然暂时避免了问题的发生,但是显然这不是很友好的解决方案,因为在实际编程中你无法预料子线程什么时候会结束,也就无法给出准确的sleep的时间。
本文主要讨论下利用pthread_join()函数解决这个问题,首先,看一下函数的原型:
pthread_join的第一个参数是创建的子线程线程ID,第二个参数是子线程函数的返回值地址的指针,也就是其返回值地址的地址。pthread_join的作用就是等待第一个参数指定的线程的结束,在等待期间该函数是阻塞的,等到子线程结束后,函数结束阻塞状态。下面我们就在代码中演示下pthread_join的用法:
第4行我们定义了一个线程的主函数thread_main;
第21行利用pthread_create()函数创建了一个线程,分别将通过pid获取到了线程ID、传入线程函数,然后利用max传入线程函数的参数。
第22行调用pthread_join()函数等待线程的结束,通过函数的第一个参数指定要等待的线程,第二个参数用来接收线程函数返回值,注意rst是一个void**的指针。
最后打印出线程函数的返回值。
至此,我们没有使用sleep()函数使主线程睡,也完美实现了等待子线程的结束,来看下运行结果:
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL35
还没结束时,但是此时主线程函数已经结束,那么子线程也会被强制销毁,为了避免这个问题,当时我们在主线程中sleep了11秒钟以等待子线程的结束。虽然暂时避免了问题的发生,但是显然这不是很友好的解决方案,因为在实际编程中你无法预料子线程什么时候会结束,也就无法给出准确的sleep的时间。
本文主要讨论下利用pthread_join()函数解决这个问题,首先,看一下函数的原型:
#include <pthread.h>int pthread_join(pthread_t thread, void **retval);
pthread_join的第一个参数是创建的子线程线程ID,第二个参数是子线程函数的返回值地址的指针,也就是其返回值地址的地址。pthread_join的作用就是等待第一个参数指定的线程的结束,在等待期间该函数是阻塞的,等到子线程结束后,函数结束阻塞状态。下面我们就在代码中演示下pthread_join的用法:
#include<stdio.h>#include<pthread.h>void* thread_main(void* pmax){int i;int max=*((int*)pmax);for(i=0;i<max;i++){puts("child thread called...");sleep(1);}return "Tread ended ...";}int main(){pthread_t pid;void* rst;int max=10;pthread_create(&pid,NULL,(void*)thread_main,(void*)&max);pthread_join(pid,(void*)&rst);printf("the child return: %s\n",(char*)rst);return 0;}
第4行我们定义了一个线程的主函数thread_main;
第21行利用pthread_create()函数创建了一个线程,分别将通过pid获取到了线程ID、传入线程函数,然后利用max传入线程函数的参数。
第22行调用pthread_join()函数等待线程的结束,通过函数的第一个参数指定要等待的线程,第二个参数用来接收线程函数返回值,注意rst是一个void**的指针。
最后打印出线程函数的返回值。
至此,我们没有使用sleep()函数使主线程睡,也完美实现了等待子线程的结束,来看下运行结果:
[Hyman@Hyman-PC multithread]$ gcc ts.c -lpthread[Hyman@Hyman-PC multithread]$ ./a.out child thread called...child thread called...child thread called...child thread called...child thread called...child thread called...child thread called...child thread called...child thread called...child thread called...the child return: Tread ended ...
Github位置:
https://github.com/HymanLiuTS/NetDevelopment
克隆本项目:
git clone git@github.com:HymanLiuTS/NetDevelopment.git
获取本文源代码:
git checkout NL35
0 0
- 网络编程(35)—— 利用pthread_join函数等待线程结束并获取线程函数返回值
- pthread_join(等待另一个线程结束)
- pthread_join pthread_exit 线程 Linux函数 线程退出 线程等待
- 线程函数pthread_join
- linux 线程等待与退出 pthread_join pthread_exit 函数
- 等待线程退出pthread_join
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- pthread_join函数及linux线程
- 如何更改电脑盘符
- popwindow被虚拟按键遮挡
- flex灵活布局
- IO设备
- AngularJS 异常处理
- 网络编程(35)—— 利用pthread_join函数等待线程结束并获取线程函数返回值
- 背靠支付宝的“口碑”这次能跑在前面吗?
- 一些漂亮的响应式网站学习
- Android仿QQ侧滑(删除、置顶等)功能
- js将table导出excel 之文件改名及格式化全攻略
- ios-生成二维码
- Gradle for Android-管理依赖
- Android 布局color颜色值大全
- 面向对象(封装,继承,多态)