RTT的线程同步篇——事件

野火RTT第21章事件
2018年12月29日
10:47

事件也是线程间通信,仅用于实现线程间同步,而不能传输数据。可以在中断中发送事件。

一对多:一个线程等待多个事件触发:多个事件中的任意一个发生就能唤醒线程这也叫独立型同步(逻辑或),也可以多个事件发生后才能唤醒线程,也叫关联型同步(逻辑与)。也就是:多个事件只是针对这一个线程,这多个事件只和某个线程绑定,这么多事件的触发只对一个线程有效,只决定一个线程的生死。实现方式:一个32为变量代表32种类型事件触发状态,而这个变量只能被某个线程使用,不对外开放。

多对多:多个线程等待多个事件的触发。多个事件触发的不仅仅局限于一个线程了,可以触发多个线程。也就是多个事件和好几个线程绑定,多个事件触发不仅一个线程。这种实现方式:多个变量多个线程都能使用,很开放。

事件的代码表示实现方式:用32位变量表示32种事件。
线程通过逻辑与或逻辑或与事件产生联系。
裸机中的全局标志变量在操作系统中得转化成事件。
事件的应用:检测危险动作的满足条件。
中断中可以向事件对象发送事件。
事件的发送操作是不累计的。
使用完事件后要清零对应事件。
发送事件会触发线程调度。
当这个事件只发生一次再也不会发生,那可以删除掉这个事件的。

1.事件发送函数:若事件置0标志,返回错误,发送只会置1,清零函数才会清零。然后若在这期间没有线程来获取事件而被阻塞就不用开启调度,直接退出,置完这就算完了。若有被阻塞的线程,则遍历被阻塞的线程,若有满足其线程恢复的条件则将其线程恢复,并执行调度。进入恢复被阻塞的线程。事件发生了,就调用事件发送函数置标志位。
2.事件接受函数,判断是否满足线程运行所需事件,不满足就根据超时设置对线程进行阻塞、返回错误码等,同时将接受的条件(标志位几个事件标志都要置起或多个事件其中一个触发)、还有清零等设置保存到对应线程控制块的事件成员中。

接受事件阻塞线程,发送事件中判断是否满足接受事件函数输入的参数,如果满足就恢复阻塞线程,刚好继续上次那个地点继续运行,因为一旦回来运行说明已经是满足条件了。
接受和发送事件都有判断是否满足条件,接受判断不满足阻塞,发送不满足不恢复阻塞线程直到满足才恢复阻塞线程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值