今天跟大家聊聊RT-Thread线程间通信的学习过程,可能很多人都不太了解。为了让大家更好的了解,边肖为大家总结了以下内容,希望大家能从这篇文章中有所收获。
以下是与RT-Thread多线程相关的最后一个重要知识的总结:线程间通信。前一篇文章多次提到,一个大任务分成几个小任务,这些小任务之间必然存在各种关系,导致这些小任务的线程无法各行其是,必须考虑其他任务线程的运行情况。
既然有了线程间同步,多个线程就可以相互通信了,那为什么还需要线程间通信呢?线程间通信到底是什么?这种方法有哪些应用场景?边肖试图从以下几个方面总结RT-Thread线程间通信的学习过程。
线程间通信的相关概念
什么是线程间通信?沟通,顾名思义,就是双方都需要沟通和交谈。一般来说,线程A在工作过程中会有一些数据或信息,这样线程B在收到数据或信息后就可以继续完成指定的任务和工作。
为什么两个线程要通信?同样,多个任务线程不是独立的。当他们工作时,他们需要根据业务场景相互沟通。或者以音乐播放器为例。当歌词阅读线程从硬盘中读出歌词时,需要将这串歌词告诉显示线程,让它显示歌词。这个“讲”的动作是通过线程间的通信来实现的。
2.png
既然都是为了协调线程的工作状态而设计的,那么线程间同步和线程间通信有什么区别呢?不同的是线程间同步能做的事情太有限了。线程间的同步只是告诉对方“不要跑太快,等我~”,而线程间的通信则意味着有大量的数据和信息要告诉对方。万一线程A对线程B有很多话要说,线程同步的方法不能满足要求,需要线程间的通信。
当邮箱正在使用时,它可能是空的或满的。当邮箱为空时,接收邮件的线程会选择挂机等待,或者等待超时。当邮箱满了,发送邮件的线程会选择挂起或者直接返回一个满邮箱的返回值。
系统内核提供了如下与邮箱相关的API函数接口,如下图所示。
当线程A想要发送消息时,首先从空闲消息块链表中取出一块空间,将消息加载到其中后,将消息块挂到非空消息块链表的尾部。如果在紧急模式下发送消息,消息块将链接到非空消息链表的队列头。当一个线程得到一条消息时,它总是在链表的头部得到这条消息。
系统内核提供了如下与消息队列相关的API函数接口,如下图所示。
系统内核提供了以下与信号相关的API函数接口,如下图所示。
线程间通信的注意事项
在多线程通信过程中,邮箱、消息队列、信号这三种线程间通信方式有一些注意事项:
1.使用email进行线程间通信时,由于一封email最多只能有4个字节的长度,如果想要传输更多的数据信息,可以使用结构体封装信息,通过指针进行传输。
2.邮件传递是无阻塞的,因此可以应用于中断服务程序。但是邮件接收被阻止,可以设置接收超时的时间,在中断服务程序中不能使用邮件接收。
3.当邮箱中没有邮件并且超时时间不为0时,邮件接收过程将自动被阻止。当邮箱已满时,发送线程可以选择暂停等待,也可以在邮箱已满时直接返回错误代码。
4.消息队列是一种异步通信方式,消息队列中的消息始终遵循先进先出的原则。
5.您可以在线程或中断服务程序中向消息队列发送消息,但不能在中断服务程序中接收消息。
6.紧急消息可以发送到消息队列。紧急消息将被放在消息队列的链表的头部,并首先被等待的线程获取。
7.信号不同于信号量,两者的概念不能混淆。信号是软件级的软中断模式。
8.线程不会通过阻塞来等待信号,因为线程本身不知道信号(软中断)什么时候会到达。
9.默认情况下,信号的线程处理可以设置为捕获信号、忽略信号和处理信号。
看完以上,你对RT-Thread线程间通信的学习过程有了更好的了解吗?如果您想了解更多知识或相关内容,请关注行业资讯频道,感谢您的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/150150.html