ITcool

ITcool.net
IT资源网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

学习RT-Thread多线程通信,总结分享

2023年7月4日 245点热度

前两篇文章总结了RT-Thread多线程以及多线程同步的学习过程,关于前两篇学习总结,可以查看以下链接:

本篇文章继续总结关于RT-Thread多线程相关的最后一个重要知识点:线程间通讯。后面的文章多次提到到,一个大的任务分拆为多个小任务,这种小任务之间必然存在着各类各样的关系,造成这种小任务的线程不能各自为政,必需要考虑其他任务线程的运行情况。

既然早已有了线程间同步,可以让多个线程之间进行互相沟通,那为何还须要线程间通讯呢?线程间通讯究竟是哪些东西,这些方法有哪些应用场景?

关于多线程之间的通讯,RT-Thread官方提供了比较丰富的文档作为参考,具体可以查看以下链接:

本文尝试从以下几个方面总结一下RT-Thread线程间通讯的学习过程

线程通信方法_线程通信原理_linux线程间通信

线程间通讯的相关概念

哪些是线程间通讯?通讯,顾名思义,就是双方须要进行沟通与对话。浅显地概括,就是A线程在工作运行期间,有个别数据或则信息,要告诉B线程,让B线程接收到那些数据或信息后,才能继续完成指定的任务和工作。

两个线程之间为何要进行通讯呢?还是那句话,多个任务线程并不是独立的,它们在工作的时侯是须要依照业务场景进行一定的沟通的,还是以音乐播放器举例,当歌词读取线程把歌词从硬碟上面读下来了,要把这一串读到的歌词告诉给显示线程,让它把歌词显示下来。这个“告诉”的动作,就是通过线程间通讯来进行的。

linux线程间通信_线程通信原理_线程通信方法

既然都是为了协调线程的工作状态,线程间同步和线程间通讯这三者有哪些区别呢?区别就是线程间同步能做的事情太有限了,线程间同步只是告诉一下对方“别跑太快,等等我嘛~”,而线程间通讯,就是有一大堆的数据和信息要告知对方,万一A线程有好多话要跟B线程说,线程同步这些方法就不能满足要求了,所以须要线程间通讯。

线程通信方法_线程通信原理_linux线程间通信

线程间通讯的方法

针对RT-Thread实时操作系统,线程间通讯主要有三种形式:邮箱,消息队列,讯号。这三种线程间通讯机制都有各自的特性,在实际开发工作上面,须要依照不同的应用场景进行分辨使用。

邮箱是线程间通讯的其中一种形式,这个邮箱的概念,跟我们生活中使用的邮箱概念,虽然是太原小异的,在生活中,假如我们有信函要寄,就把信函往邮筒一扔就可以了,邮局会负责把信函送往目的地。

同样的道理,当A线程有信函(即数据)要发送给B线程,只须要调用操作系统提供的邮箱相关插口函数,把数据发送出去,操作系统都会负责把数据转发到目标线程,整个转发过程是如何实现的,收和发的线程都不须要关心。

使用邮箱进行线程间通讯,特征是开支低,效率高。这是由于,每位电邮信息最多只能是4个字节的内容,所以,这个电邮信息可以是某个数据块的表针,通过表针传递的方法,来传输更多的数据。

线程通信原理_linux线程间通信_线程通信方法

邮箱在使用过程中,可能会存在邮箱空或邮箱满的情况,在邮箱空的情况下,接收短信的线程会选择挂起等待,或则等超时时间到来。在邮箱满的情况下,发送短信的线程会选择挂起或直接返回一个邮箱满的返回值。

系统内核提供以下邮箱相关的API函数插口,如右图所示。

linux线程间通信_线程通信原理_线程通信方法

消息队列是另外一种比较常用的线程间通讯方法,相当于邮箱的扩充。跟邮箱不同的是,消息队列是可以接收不定长的数据的linux线程间通信,但是把这个不定长的数据复制到自身线程的显存空间。

消息队列似乎就是一个数据储存空间,这个储存空间遵守先进先出的原则,也就是说,不管是哪些消息,等待消息的线程获得的是最先步入队列的消息。

消息队列控制块上面,虽然有两个数组,一个数组是拿来挂接空的消息块(也就是没有内容的消息队列),另一个数组是拿来挂接存有消息的消息块,具体具象如右图所示。

linux线程间通信_线程通信方法_线程通信原理

当线程A要发送一个消息时,先从空闲消息块数组取出一个块空间,把消息装进去后,把这个消息块挂接到非空消息块数组的队尾。假如使用紧急形式发送消息,则把该消息块挂接到非空消息数组的队首。线程获取消息的时侯,总是会获取数组头的消息的。

系统内核提供以下消息队列相关的API函数插口,如右图所示。

linux线程间通信_线程通信原理_线程通信方法

讯号,在软件层次上似乎相当于一种软中断的方法,这些中断机制是操作系统模拟下来的,一个线程收到一个讯号,跟硬件处理器收到一个硬件中断恳求,这个过程基本上是类似的。

当一个线程在正常运行期间,倘若其他线程有突发的风波或异常通知须要处理,就可以通过讯号的形式发送出去,线程在正常运行期间不须要等待讯号的到来(由于不晓得讯号哪些时侯会到来)。

linux线程间通信_线程通信原理_线程通信方法

收到讯号的线程,对各类讯号的处理有以下三种方式:

1、类似中断的处理程序,可以针对须要处理的讯号指定处理函数linux操作系统培训,由该函数来处理。

2、直接忽视某个讯号,对该讯号不做任何处理,如同未发生过一样。

3、使用系统保留的默认值来处理该讯号。

线程通信方法_线程通信原理_linux线程间通信

系统内核提供以下讯号相关的API函数插口,如右图所示。

多线程通讯的应用示例

多线程通讯的应用示例,主要是为了验证邮箱,消息队列,讯号的API插口函数,但是通过实验现象观察这三种线程通讯形式的运行情况。

示例源码下载链接:

线程通信方法_线程通信原理_linux线程间通信

邮箱示例主要是初始化了2个静态线程,一个静态的邮箱对象,线程2发送短信,共发送11次,线程1接收短信,共接收到11封电邮,将电邮内容复印下来,并判定结束。

消息队列示例主要初始化了2个静态线程,线程1会从消息队列中缴纳消息,线程2定时给消息队列发送普通消息和紧急消息。因为线程2发送消息“I”是紧急消息,会直接插入消息队列的队首,所以线程1在接收到消息“B”后,接收的是该紧急消息,然后才接收消息“C”。

讯号示例主要是创建了1个线程,在安装讯号时,讯号处理方法设为自定义处理,定义的讯号的处理函数为thread1_signal_handler(),待此线程运行上去安装好讯号然后,给此线程发送讯号,此线程将接收到讯号,并复印信息。

具体示例的实现可以查看工程源码红旗linux6.0,在thread_communication.h头文件中,打开相应的宏定义开关,重新编译工程并下载到开发板即可。

线程通信方法_linux线程间通信_线程通信原理

线程间通讯的注意事项

在进行多线程间通讯的时侯,关于邮箱、消息队列、信号这三种线程间通讯方法,有以下一些注意事项:

1、使用邮箱进行线程间通讯时linux线程间通信,因为一封短信最多只能是4个字节宽度,因而假如要传递较多数据信息,可以使用结构体进行信息封装,通过表针形式进行传递。

2、邮件发送是非阻塞的,因而可以应用于中断服务程序中。但短信接收是阻塞的,可以设置接收超时的时间,不能在中断服务程序上面使用短信接收。

3、当邮箱没有电邮且超时时间不为0,短信的接收过程手动变为阻塞形式。当邮箱满了后,发送线程可以选择挂起等待或直接返回邮箱满的错误码。

linux线程间通信_线程通信原理_线程通信方法

4、消息队列是一种异步的通讯方法,消息队列上面的消息总是依循先进先出的原则。

5、可以在线程或中断服务程序上面可以给消息队列发送消息,但不能在中断服务程序上面接收消息。

6、可以往消息队列上面发送紧急消息,紧急消息会被放置到消息队列的数组头,会首先被等待的线程获取。

7、信号跟讯号量不同,不能混淆二者的概念,讯号是软件层面上的一种软中断形式。

8、线程不会用阻塞的形式等待讯号的到来,由于线程自身也不晓得这个讯号(软中断)哪些时侯会到。

9、线程对讯号的处理,可以设置为捕捉讯号,忽视讯号,使用默认方法处理讯号。

谢谢阅读!

--END--

关注并回复【技术文档】,可下载所有专辑的PDF文档

欢迎关注---微联智控工作室

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 信号 消息 线程 通信 邮箱
最后更新:2023年7月4日

IT资源网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

IT资源网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
主流Linux发行版下的JDK环境变量配置文件对比评测 在Linux下将Qt程序打包发布可以通过以下步骤完成 如何通过命令行查看Linux系统版本号 麒麟系统开发笔记(八):ubuntu发布程序打包流程 深度解析LinuxC编程文件修改 刚学习Linux操作系统的启动流程是最基本的内容 kali linux安装qq 如何选择Kalilinux及解决问题 linux指令范例速查手册(第2版) Linux用户空间内存申请性能评测:malloc vs new 市面上的房产中介管理软件有哪些是提供源代码 Linux文件词频统计实用技巧 Linux内核启动过程中的操作系统运行的机理是什么 2023年Linux发行版大揭秘 Linux系统修改文件权限的详细介绍-苏州安亲宝 Linux基础教程:安装与配置 5.4将一条命令的输出插入另一个命令116 服务器安全狗Linux特点解析 QT开发应用运行用到的Qt库:ARMCreatorruninstallinstall gnu/linux linux GNU/Linux:回首往事 如何查看Linux系统中安装的Python版本信息
CGI文件:一场数字世界的魔法如何查看Linux系统中安装的Python版本信息探秘Linux触摸屏驱动RedHatEnterpriseLinux5Samba服务器介绍(hostname10)联想电脑装linux系统(光驱笔记本光驱装鸿蒙系统教程)使用GTK来开发LinuxGUI界面的开源工具包应用程序实现这个协议的常用服务器有:apacheIIS等请求基于主机的虚拟化基于存储设备的存储虚拟存储方法Linux版本查询技巧Linux系统内核与Linux发行套件系统的不同作用介绍Snort开源入侵检测系统的技术特点及应用价值特点分析Linux下写FAT32文件系统的错误处理方式的参数提升数据库性能:Linux下设置MySQL变量的经验联想ThinkPad将向用户提供预装Linux操作系统的笔记本电脑深入探讨Linux桌面虚拟化的优势魔方OA办公管理系统的OA源码给企业提供了自由定制和二次开发的机会Linux下重启MySQL数据库的注意事项LINUX发行版同LINUX应用程序的良好结合具体地说Linux文件系统中inode的重要性基于命令`lsoffilename`检查文件权限的解决办法!
全硬盘安装OpenWrt镜像使用PE启动U盘进入PE系统 Linux软件安装目录:解析与应用 Windows上运行Linux程序:7步搞定! 比较tmux、GNU、Konsole和Terminator,看看哪个最适合你 Linux查看版本当前操作系统内核信息的参考学习价值介绍 腾讯又开源了一个智能运维学件平台Metis 如何在Linux中使用parted命令来对存储设备进行分区 如何利用git在Linux中进行提交代码的工作? 知识储备常用Linux命令软件准备(含永久激活密匙) Python升级到最新版本,您需要首先了解当前的版本 Linux文本界面使用命令删除目录的方法和使用方法介绍 用虚拟机搭建Linux开发环境,高效起航 第一张开放源代码报告卡:Google员工最常用的语言 魅力 Linux:执行命令的艺术 GitLab安装过程的记录以及使用,方便后期自己使用! linux vim 安装 Linux环境下,Vim编辑器对比评测,让你成为安装达人 直播间源码可以完成的工作,看完文章觉得有用处的话别忘点赞 搜狗拼音输入法LINUX版版官方下载 ARMLinux内核调试,你懂吗? Linux下写FAT32文件系统的错误处理方式的参数
标签聚合
目录 应用 内核 文件 linux系统 开源 命令 操作 linux服务器 软件
书籍
课程
技术群
技术干货大合集↓
  • 2023年12月 / 12篇
  • 2023年11月 / 83篇
  • 2023年10月 / 124篇
  • 2023年9月 / 119篇
  • 2023年8月 / 123篇
  • 2023年7月 / 122篇
  • 2023年6月 / 119篇
  • 2023年5月 / 124篇
  • 2023年4月 / 70篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2024 ITcool.net ALL RIGHTS RESERVED.

京ICP备14023444号-4