本章介绍如何使用邮箱进行单向同步,但这里不同于前一小节介绍的使用信号量单向同步。

前面所介绍的同步只用处理单一事件的同步,而这里的可用于多个事件的同步。

主要内容

前一节课时在讲信号量实现单向同步时,我们了解到每次发送通知时,计数信号量的计数值+1;当任务接收通知时,计数减1。无论是谁发送通知,发送多少次,都只是改变计数,获取通知的一方并不知道究竟是谁发的通知,这个通知代表什么含义。
在某些情况下,我们可能需要应对两种问题。这两种问题,都是使用信号量无法解决的。

知道究竟是谁发送的通知

如下图所求,多个任务向某任务发通知,只采用信号量是无法实现的。
用邮箱实现多事件的单向同步 - 图1

知道究竟是出于什么原因发的通知

这个问题在视频中没有讲。
具体来说,比如某个任务向另一任务发通知,但是可能出于不同的原因。如果接收方希望能知道这种原因,只采用信号量也是没有办法实现这种功能。

邮箱的解决方案

以上两种方式,可以采用信号量 + 全局数据的方式来实现。全局数据保存了通知由谁发送/发送的原因,但是这样一来就需要额外的共享资源的保护。此外,如果希望支持缓存发送的多个通知,那么还得采用比如链表等方案对这些数据进行组织。这种方案比较复杂。
邮箱在某种程度上相当于实现了这种方案。通过邮箱,发送方可以告诉接收方消息邮谁发送或者发送的原因等。
用邮箱实现多事件的单向同步 - 图2

重点难点

注意事项

其它方案

除此之外,还可以使用事件标志组来实现同步。事件标志组中的每个位可以自定义为代表通知来源于某个任务,或者是某种原因。
用邮箱实现多事件的单向同步 - 图3
但是,这种方式也有不足。事件标志组中的各个位无法计数,无法累加某个任务/某种事件发送的事件次数。

常见问题