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之线程间的通信相关推荐

  1. Java 多线程(七) 线程间的通信

    Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...

  2. Android开发之Service通过Messenger实现线程间的通信

    Messenger信使其实在真正使用中用到的并不多,但是面试的时候考官还是十分想要考察一下你的基本功的.那我们现在先来看一下Messenger的使用场景.如果你需要你的Service与远程线程通信,那 ...

  3. 线程间的通信 共享数据安全问题

    1 //线程间的通信:线程的任务不同,但是线程操作的数据相同. 2 3 //描述数据 4 class Resource 5 { 6 public String name; 7 public Strin ...

  4. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  5. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  6. 高并发编程-线程通信_使用wait和notify进行线程间的通信

    文章目录 概述 场景 引子 synchronized wait/notify机制 synchronized wait/notify 改造 问题 概述 Java中线程通信协作的最常见的两种方式: syn ...

  7. educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)

    这篇文章主要从4个角度来讲多线程间的通信: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 等待/通知机制的实现: (1)wa ...

  8. java 线程间通信 handler_Handler不同线程间的通信

    转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程( ...

  9. Java中condition的用法_java5 Condition用法--实现线程间的通信

    Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ...

最新文章

  1. 计算机竞赛游戏探险岛,冒险岛2五大全新团本综合分析
  2. linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集
  3. 同一个浏览器打开不同端口的程序登录_【BI报表制作】单点登录与个性化开发...
  4. 微信小程序 navigator 用来实现页面跳转功能
  5. mysql数据库批量修改
  6. 深度学习2.0-36.循环神经网络RNN-时间序列表示方法
  7. 网站建设中HTML编写技巧你必须掌握的30个 提升你的编写能力|网站建设
  8. Listary免费版下载与安装
  9. STM32MP157 Linux系统移植开发篇16:Linux内核音频驱动移植
  10. 企业如何安装linux软件下载,linux系统安装软件方法大全
  11. python同步油管用户信息
  12. 高端存储未来之路在哪?VSP 5000系列带来新答案
  13. linux总复习(二)
  14. IBM创始人 托马斯·约翰·沃森父子
  15. tie cell:tie high tie low
  16. 【Redis】redis cluster模式实现双机房容灾切换
  17. 什么是思维导图  绘制思维导图用什么工具
  18. NFT Insider #63:The Sandbox与时代杂志达成合作,YGG成立西班牙subDAO
  19. 2020前端面试题72道总结
  20. c语言指针翻转星星亮暗,C语言实现动态星空

热门文章

  1. 密码字典大全(seclists)
  2. 【工业互联网】项天成:实体经济需要智能服务;王洪添:浪潮M81工业互联网平台
  3. 无线局域网技术(二)无线传输技术基础
  4. 大学生开学需要准备哪些数码产品、五款大学生必买的电子产品
  5. JAVA 访问MySQL数据库(使用方法及测试)
  6. php赵普,赵普辞职央视主播一年多 自己创办了“东家守艺”
  7. cesium模拟计算点
  8. 学会自我赋能的五点(深度好文)
  9. Word表格处理技巧
  10. 返利软件哪个佣金高,最高的是哪个