RT-Thread编程指南 要点摘录(四)——线程间同步

1线程间同步

在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成。

任务线程之间可能会共享资源。例如,一个任务负责从传感器获取数据,存入共享内存,另一个任务负责读取共享内存的数据并显示出来,如果显示线程在读取内存数据过程中,读传感器线程同时向内存写入数据,则显示出来的数据会新旧混在一起,产生错误。
在这里插入图片描述

这类必须一个任务操作完成后,另一个任务才能访问的资源称为临界资源,当多个线程都要使用临界区资源时,任何时刻最多只允许一个线程去使用,这种现象被称为线程互斥,即对于临界区资源访问的排它性,属于特殊的线程同步;
使用临界资源的那一部分程序(被多个线程操作/访问的一块区域)称为临界区,如上文中的共享内存块,在运行完毕前,任何线程不能迫使已处在临界区的线程释放资源。

同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序。
线程同步的核心思想:在访问临界区的时候只允许一个 (或一类) 线程运行

RT-Thread支持的同步方式:信号量(semaphore)、互斥量(mutex)、和事件集(event)。

2信号量工作机制

线程同步机制支持线程按优先级等待(PRIO)或按先进先出(FIFO)方式获取信号量或互斥量。

2.1基本概念

信号量是一个带有非负整数值的变量,可以初始化为0或非0,如果限制信号量的取值为0或1两个值,则称为二元信号量,一般的信号量可以用二元信号量实现。

每个信号量对象都有一个信号量值和一个线程等待队列。
信号量值:对应了信号量对象的实例数目、资源数目
线程等待队列:当信号量实例数目为零时,再申请该信号量的线程就会被挂起在该信号量的等待队列上(挂起或超时返回)

以停车场为例,管理员就相当于信号量,管理员手中空车位的个数就是信号量值;停车位相当于临界区,车辆相当于线程。车辆通过获得管理员的允许取得停车位,就类似于线程通过获得信号量访问公共资源。如果信号量值为0,再申请该信号量的线程被阻塞,会被挂起在该信号量的等待队列上,等待可用的信号量实例(资源),直到信号量非0,线程进入就绪状态;如果信号量值不为0,则信号量减1,线程向下执行。

线程同步是信号量最简单的一类应用,信号量也可用于其他场合中。

2.2缺点

  1. 死锁:两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
  2. 优先级翻转:当一个高优先级线程试图通过信号量机制访问共享资源时,如果该信号量已被一低优先级线程持有,而这个低优先级线程在运行过程中可能又被其它一些中等优先级的线程抢占,因此造成高优先级线程被许多具有较低优先级的线程阻塞,实时性难以得到保证。
  3. 信号量只能识别单一的释放动作,而不能同时等待多种类型的释放。

2.3信号量的管理方式

在这里插入图片描述

3互斥量

3.1基本概念

互斥量是一种特殊的二值信号量,类似于只有一个车位的停车场。
互斥量有开锁闭锁两种状态:当有线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权;相反,当这个线程释放它时,将对互斥量进行开锁,失去它的所有权。为互斥量加锁和解锁的线程必须是同一个线程。

互斥量和信号量不同的是:拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止线程优先级翻转;并且互斥量只能由持有线程释放,而信号量则可以由任何线程释放。

互斥量使用场合较为单一,因为它是信号量的一种,并且是以锁的形式存在。互斥量通常用来解决信号量的同一线程多次递归持有而造成死锁 的问题(通过互斥量本身构造特点)和优先级翻转问题:
互斥量通过优先级继承算法解决优先级翻转问题。
优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。

3.2管理方式

在这里插入图片描述

4事件集

4.1基本概念

一个事件集可以包含多个事件,相当于多个二元信号量的组合,在一定程度上可以代替信号量;但是它与信号量不同的是,事件的发送操作在事件未清除前,是不可累计的,而信号量的释放动作是累计的,即事件无排队性,即多次向线程发送同一事件 (如果线程还未来得及读走),其效果等同于只发送一次。
此外利用事件集可以实现一对多(一个线程对应多个事件)、多对多(多个线程对应多个事件的同步)。例如,一个线程与多个事件的关系可设置为:其中任意一个事件唤醒线程,或几个事件都到达后才唤醒线程进行后续的处理。
RT-Thread中用一个32位的无符号整型变量表示多个事件的集合,每一位代表一个事件,因此每个线程可拥有 32 个事件标志,所以事件只与线程相关,事件间相互独立。特定线程只等待、接收它关注的事件。
线程通过“逻辑与”或“逻辑或”与一个或多个事件建立关联,形成事件组合,即事件集。

  1. 事件的 “逻辑或” 也称为是独立型同步,指的是线程与任何事件之一发生同步;
  2. 事件 “逻辑与” 也称为是关联型同步,指的是线程与若干事件都发生同步。

4.2管理方式

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值