rtth之线程间的通信
IPC基础
线程间同步
一、前言 除了抢占式调度机制,各线程间同步是相互协作处理事件和数据的基础。 线程间通信/同步(IPC:Inter-Process Communication)是一个多任务操作系统内核必不可少的部分。
线程间同步基本概念 线程间通信IPC的目的:多个线程按预定的先后次序进行运行,所以也被称为线程间同步。在嵌入式操作系统中,运行代码主要包括线程 和 ISR,在他们的 运行过程中,因为应用或者多线程模型带来的需求,有时候需要同步,有时候需要互斥,有时候也需要彼此交换数据。 操作系统必须提供相应的机制来完成这些功能,这些机制统称为 线程间通信(IPC机制)
线程间同步方式:多个线程通过特定的机制(信号量(semaphore)、互斥量(mutex)、临界区(CRITICAL)、和事件集(event))来控制线程之 间的执行顺序。-
临界区:
就是我们一个资源空间(会被多个线程访问的空间叫做临界区)一次只能由一个线程访问,为了让其他线程不让其他线程打扰它运行,我们使用下面两个方法(实际就是在读取空间信息线程运行之前加一个命令关闭中断,在线程运行结束读取文件之后加一个命令打开中断)
1、关闭中断(没有中断我们也无法执行线程切换)
rt_hw_interrupt_disable() / rt_hw_interrupt_enable() 关\开 必须配对
2、关闭调度(没有关中断): rt_enter_critical() /rt_exit_critical() 关\开 必须配对
二、IPC的实现方式
对象封装的结构体:属性、list项、处理函数的指针
list项:
链表里面放的线程都同一个优先级的
我们的每一个线程挂钩元素(list项),可以把这个变量(地址)放到链表rt_list中,等要运行的时候我们可以通过这个变量来启动线程。我们也可以通过这个list项来反推对象控制块的首地址,从而来控制控制块结构体内其他的元素。
容器:链表数组list[]:我们把一个链表作为一个数组元素
比如:list[0]代表优先级为零的线程的集合链表,list[21]代表了优先级为21的线程的集合链表
属性:
比如value、name之类的
处理函数的指针:
存放比如信号量的地址
信号量的结构体控制块:
我们的信号量是semaphorej 结构体(最底层)
内部有:parent结构体(父类是ipc_object,parent是子类完全继承了父类),value元素,reserve元素(该程序没有)
然后:ipc_object结构体
里面有一个parent结构体(继承了父类rt_object全部属性)、suspend_thread链表
最后:rt_objetct结构体(最外层)
里面有name数组、type、flag,list
list是list项 用来控制这个结构体
suspend_thread也是list项 是用来挂起对象
三、信号量(semaphore)
个人说明:信号量就是一个结构体里面有个变量存放了车位,车进车出是两个线程。车进线程运行车位变量减一,相应的加一。等到我们车位为零,进车线程就无法实现。
信号量官方的说明是:信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。
信号量非常灵活,可以使用的场合也很多:
• 比如 一个典型的应用场合就是停车位模型,总共有多少个车位,就是多少个信号量,入口进入一辆车信号量-1,出口离开一辆车信号量+1。
• 比如 两个线程之间的同步,信号量的值初始化成 0,而尝试获得该信号量的线程,一定需要等待另一个释放信号量的线程先执行完。 在 FreeRTOS 中存在二值信号量,但是 RT-Thread 中已经没有了,官方有说明:
信号量记住一句话基本就可以,释放一次信号量就+1,获取一次就-1,如果信号量数据为0,那么尝试获取的线程就会挂机,直到有线程释放信号量使得信号量大于 0
3.1 信号量控制块
控制块名字叫做 rt_semaphore
里面有一个控制块名字叫做parent(父类是ipc_object)、value、reservel
3.2 信号量操作
3.2.1 创建和删除
同以前的线程那些一样,动态的方式,先定义一个信号量结构体的指针变量,接收创建好的句柄(结构体的首地址)。
3.2.2初始化和脱离
静态的方式,先定义一个信号量结构体,然后对他进行初始化。
初始化信号量:
3.2.3 获取信号量
3.2.4 释放信号量
3.3示例
停车厂模型,key2按下代表车辆进入,key3按下代表车辆出去
rtth之线程间的通信相关推荐
- Java 多线程(七) 线程间的通信
Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...
- Android开发之Service通过Messenger实现线程间的通信
Messenger信使其实在真正使用中用到的并不多,但是面试的时候考官还是十分想要考察一下你的基本功的.那我们现在先来看一下Messenger的使用场景.如果你需要你的Service与远程线程通信,那 ...
- 线程间的通信 共享数据安全问题
1 //线程间的通信:线程的任务不同,但是线程操作的数据相同. 2 3 //描述数据 4 class Resource 5 { 6 public String name; 7 public Strin ...
- 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll
文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信
文章目录 概述 场景 引子 synchronized wait/notify机制 synchronized wait/notify 改造 问题 概述 Java中线程通信协作的最常见的两种方式: syn ...
- educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)
这篇文章主要从4个角度来讲多线程间的通信: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 等待/通知机制的实现: (1)wa ...
- java 线程间通信 handler_Handler不同线程间的通信
转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程( ...
- Java中condition的用法_java5 Condition用法--实现线程间的通信
Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...
最新文章
- 计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析
- linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集
- 同一个浏览器打开不同端口的程序登录_【BI报表制作】单点登录与个性化开发...
- 微信小程序 navigator 用来实现页面跳转功能
- mysql数据库批量修改
- 深度学习2.0-36.循环神经网络RNN-时间序列表示方法
- 网站建设中HTML编写技巧你必须掌握的30个 提升你的编写能力|网站建设
- Listary免费版下载与安装
- STM32MP157 Linux系统移植开发篇16:Linux内核音频驱动移植
- 企业如何安装linux软件下载,linux系统安装软件方法大全
- python同步油管用户信息
- 高端存储未来之路在哪?VSP 5000系列带来新答案
- linux总复习(二)
- IBM创始人 托马斯·约翰·沃森父子
- tie cell:tie high tie low
- 【Redis】redis cluster模式实现双机房容灾切换
- 什么是思维导图 绘制思维导图用什么工具
- NFT Insider #63:The Sandbox与时代杂志达成合作,YGG成立西班牙subDAO
- 2020前端面试题72道总结
- c语言指针翻转星星亮暗,C语言实现动态星空