操作系统:线程间同步之事件集

        事件集是线程间同步的机制之一,一个事件集可以包含多个事件,利用事件集可以完成一对多、多对多的线程间同步。

目录

一、事件集举例说明

二、事件集工作机制

三、RT-Thread为实例说明

四、事件集的应用场合


一、事件集举例说明

以坐公交车为例:

        ①P1坐公交去某地,只有一个公交可以到达目的地,等到该公交即可出发。

        ②P1坐公交去某地,有三种公交都可以到达目的地,等到其中任意一辆即刻出发。

        ③P1约另一个人P2去某地视为线程,将“公交到达公交站”、“同伴P2到达公交站”视为事件的发生,情况①是特定事件环唤醒线程;情况②是任意单个事件唤醒线程;情况③是多个事件同时发生才唤醒线程。

二、事件集工作机制

        事件集主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。即一个线程与多个的关系可设置为:其中任意一个事件唤醒线程,或几个事件都到达后才唤醒线程进行后续的处理;同样,事件也可以是多个线程同步多个事件。这种多个事件的集合可以用一个32位无符号整型变量来表示,变量的每一位代表一个事件,线程通过“逻辑与”或“逻辑或”将一个或多个事件关联起来,形成事件组合。事件的“逻辑或”也称为是独立型同步,指的是线程与任何事件之一发生同步;事件“逻辑与”也称为是关联型同步,指的是线程与若干事件都发生同步。

三、RT-Thread为实例说明

        1)事件只与线程相关,事件间相互独立:每个线程可拥有32个事件标志,采用一个32bit无符号整型数进行记录,每个bit代表一个事件;

        2)事件仅用于同步,不提供数据传输功能;

        3)事件无排队性,即多次向线程发送同一事件(如果线程还未来得及读的走),其效果等同于只发送一次。

        在RT-Thread中,每个线程都拥有一个事件信息标记,它有三个属性,分别是“与“、”或“和”清除标记”。当线程等待事件同步时,可以通过32个事件标志和这个事件信息标记来判断当前接收的事件是否满足同步条件。

        如图所示,线程#1的事件标志中第1位和第30位被置位,如果事件信息标记位设为逻辑与,则表示线程#1只有在事件1和事件30都发生以后才会被触发唤醒,如果事件信息标记位设为逻辑或,则事件1或事件30中的任意一个发生都会触发唤醒线程#1。如果信息标记同时设置了清除标记位,则当线程#1唤醒后将主动把事件1和事件30清零,否则事件标志将依然存在(即置1)。

四、事件集的应用场合

        事件集可适用于多种场合,它能够在一定程度上替代信号量,用于线程间同步。一个线程或中断服务例程发送一个事件给事件集对象,而后等待的线程被唤醒并对相应的事件进行处理。但是它与信号量不同的是,事件的发哦是那个操作在事件未清除前是不可累计的,而信号量的释放动作是累计的。事件的另一个特性是,接收线程可等待多种事件,即多个事件对应一个线程或多个线程。同时按照线程等待的参数,可选择是“逻辑与”还是“逻辑或”触发。这个特性也是信号量等所不具备的,信号量只能识别单一的释放动作,而不能同时等待多种类型的释放。

        如图所示,一个事件集包含32个事件集,特定线程只等待、接收它关注的事件。可以是一个线程等待多个事件的到来(线程1、2均等待多个事件,事件间可以使用“与”“或”逻辑触发线程),也可以是多个线程等待一个事

件的到来(事件25)。当有它们关注的事件发生时,线程将被唤醒并进行后续的处理动作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmbSW_Guru_Wx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值