Phtead_join 线程等待|学习笔记

简介: 快速学习 Phtead_join 线程等待

开发者学堂课程【物联网开发- 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。

image.png

在控制台输入./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,验证成功。

image.png

相关文章
|
7月前
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
|
7月前
|
Java 程序员 调度
如何用Java编写代码来等待一个线程join()??
如何用Java编写代码来等待一个线程join()??
21 0
|
2天前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
44 0
|
2天前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
19 4
|
2天前
简便的方法开线程干活并且出现等待提示
简便的方法开线程干活并且出现等待提示
13 3
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。
|
2天前
|
Java C++
多线程学习笔记(二)
1. 子线程先执行:启动子线程后立即调用`join()`,主线程会等待子线程完成。 `suspend()`方法。 3. `synchronized` vs `Lock`:前者是关键字,后者是接口;前者可用在代码块和方法,后者在代码中显式;前者自动释放锁,后者需`finally`释放;前者无超时/中断控制,后者可设定;前者非公平,后者可公平/不公平,且支持读写锁。 4. `synchronized`底层实现:基于 Monitor 模型,JVM层面的锁定机制,通过 monitors 和 monitorenter/monitorexit 指令实现。
|
2天前
|
安全 算法 关系型数据库
线程安全--深入探究线程等待机制和死锁问题
线程安全--深入探究线程等待机制和死锁问题
|
2天前
|
Java Linux API
Linux C/C++ 开发(学习笔记五):线程池
Linux C/C++ 开发(学习笔记五):线程池
24 0
|
2天前
|
安全 Linux 调度
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
45 0