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按下代表车辆出去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值