今天就跟大家聊聊有关RT-Thread线程间通信学习过程是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
下面总结关于RT-Thread多线程相关的最后一个重要知识点:线程间通信。前面的文章多次提及到,一个大的任务拆分为多个小任务,这些小任务之间必然存在着各种各样的关系,导致这些小任务的线程不能各自为政,必须要考虑其他任务线程的运行情况。
既然已经有了线程间同步,可以让多个线程之间进行相互沟通,那为啥还需要线程间通信呢?线程间通信到底是什么东西,这种方式有什么应用场景?小编尝试从以下几个方面总结一下RT-Thread线程间通信的学习过程
线程间通信的相关概念
什么是线程间通信?通信,顾名思义,就是双方需要进行沟通与对话。通俗地概括,就是A线程在工作运行期间,有某些数据或者信息,要告诉B线程,让B线程接收到这些数据或信息后,能够继续完成指定的任务和工作。
两个线程之间为什么要进行通信呢?还是那句话,多个任务线程并不是独立的,它们在工作的时候是需要根据业务场景进行一定的沟通的,还是以音乐播放器举例,当歌词读取线程把歌词从硬盘里面读出来了,要把这一串读到的歌词告诉给显示线程,让它把歌词显示出来。这个“告诉”的动作,就是通过线程间通信来进行的。
2.png
既然都是为了协调线程的工作状态,线程间同步和线程间通信这两者有什么区别呢?区别就是线程间同步能做的事情太有限了,线程间同步只是告诉一下对方“别跑太快,等等我嘛~”,而线程间通信,就是有一大堆的数据和信息要告知对方,万一A线程有很多话要跟B线程说,线程同步这种方式就不能满足要求了,所以需要线程间通信。
邮箱在使用过程中,可能会存在邮箱空或邮箱满的情况,在邮箱空的情况下,接收邮件的线程会选择挂起等待,或者等超时时间到来。在邮箱满的情况下,发送邮件的线程会选择挂起或直接返回一个邮箱满的返回值。
系统内核提供以下邮箱相关的API函数接口,如下图所示。
当线程A要发送一个消息时,先从空闲消息块链表取出一个块空间,把消息装进去后,把这个消息块挂接到非空消息块链表的队尾。如果使用紧急方式发送消息,则把该消息块挂接到非空消息链表的队首。线程获取消息的时候,总是会获取链表头的消息的。
系统内核提供以下消息队列相关的API函数接口,如下图所示。
系统内核提供以下信号相关的API函数接口,如下图所示。
线程间通信的注意事项
在进行多线程间通信的时候,关于邮箱、消息队列、信号这三种线程间通信方式,有以下一些注意事项:
1.使用邮箱进行线程间通信时,由于一封邮件最多只能是4个字节长度,因此如果要传递较多数据信息,可以使用结构体进行信息封装,通过指针方式进行传递。
2.邮件发送是非阻塞的,因此可以应用于中断服务程序中。但邮件接收是阻塞的,可以设置接收超时的时间,不能在中断服务程序里面使用邮件接收。
3.当邮箱没有邮件且超时时间不为0 ,邮件的接收过程自动变为阻塞方式。当邮箱满了后,发送线程可以选择挂起等待或直接返回邮箱满的错误码。
4.消息队列是一种异步的通信方式,消息队列里面的消息总是遵循先进先出的原则。
5.可以在线程或中断服务程序里面可以给消息队列发送消息,但不能在中断服务程序里面接收消息。
6.可以往消息队列里面发送紧急消息,紧急消息会被放置到消息队列的链表头,会首先被等待的线程获取。
7.信号跟信号量不同,不能混淆两者的概念,信号是软件层面上的一种软中断方式。
8.线程不会用阻塞的方式等待信号的到来,因为线程自身也不知道这个信号(软中断)什么时候会到。
9.线程对信号的处理,可以设置为捕捉信号,忽略信号,使用默认方式处理信号。
看完上述内容,你们对RT-Thread线程间通信学习过程是怎样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/219655.html