在这节课时中,我们介绍怎样用邮箱去解决任务间共享资源问题。

可能在你的印像中,邮箱只能用于传递消息,而从未听说过用于解决这类问题。是的,邮箱的主要设计用途就是用于通信,但这里我们还是可以利用其工作机制,将其用作解决共享资源问题的一种手段。 在使用和效率上,与前面所介绍的事件标志组基本一致。

主要内容

在课程中,我们介绍了邮箱的工作原理。然后提出可以利用一个称之为收发”锁消息”的方式来实现资源互斥控制,具体工作原理是这样的。
邮箱解决任务间资源共享问题 - 图1

  • 将邮箱看作一个装锁的容器。在初始化的时候,向邮箱中存入一个消息,相当于存入一把锁;
  • 当任务需要去访问资源的时候,首先从邮箱中获取这把锁,获得资源访问权,然后再去访问资源;
  • 如果有其他任务尝试去访问资源,由于邮箱中已经没有锁,任务就需要在邮箱等待队列中等待;

通过这种方式,就实现了资源之间共享的一个互斥。具体的代码演示如下:

邮箱解决任务间资源共享问题 - 图2

重点难点

输出结果解释

视频中可以看到,程序的输出结果如下。

邮箱解决任务间资源共享问题 - 图3
具体工作过程为:

  • 首先任务1开始运行,从邮箱中获取锁,访问资源,最后再释放。
    邮箱解决任务间资源共享问题 - 图4
  • 在释放的时候,虽然这个时候任务2已经在邮箱中等待消息,但是由于任务2的优先级比较低所以他没有办法立即运行。
  • 任务1继续执行,输出结果:1/1。
  • 任务2运行,对计数器进行自增。将计数器的值增加到2,输出结果:2/2

    注意事项

    本课程中所讲的邮箱,在其它操作系统中可能称之为”消息队列”等其它名称。
    不管其名称如何,只要其能实现课程所讲的这种功能,就可以用于解决任务间共享资源互斥。

    常见问题

  • 邮箱初始化时,为什么要传入数组?