【问题标题】:Looking for good analogy/examples for monitor verses semaphore寻找监视器与信号量的良好类比/示例
【发布时间】:2010-10-24 14:12:23
【问题描述】:

监视器应该解决并发环境中的信号量问题。
我正在寻找一个使用监视器与信号量的好类比。

请使用类比信息:
4 个任务(TaskA、TaskB、TaskC、TaskD)
1 个变量 varX

每个任务都想根据某个事件来操作 varX

【问题讨论】:

    标签: concurrency synchronization shared-memory semaphore


    【解决方案1】:

    假设有一群病人想去看医生。

    信号量的实现是他们都站在办公室门外,一个病人一出来,他们都想挤过去,一个人设法进去,其余的人必须再等。

    监视器实现是,所有入院患者都被送到候诊室,将确定一些相似的顺序,当一名患者完成后,另一名患者将被发送给医生。

    它们基本上是一样的,只是监视器比信号量更结构化。

    【讨论】:

    • 或者,信号量是门上的锁,而监视器是整个房间(由锁管理)。相同的想法,不同的视角。
    【解决方案2】:

    您还可以将监视器视为公共厕所。一旦有人进入关闭的厕所门,里面的人就不希望其他人进入那个空间(即监视器)。所有其他人(线程)都必须在厕所前排队等待(wait())。里面的人做完,出来后,下一个人才能进去。

    有些等待的人可能有便秘问题。出于显而易见的原因,除非他们准备好正确使用厕所,否则他们不想进去或返回。这是他们想要等待(wait())的地方,直到他们的胃向他们发出信号(signal())他们准备好去厕所了。在这发生之前,他们让其他人通过。

    来源:www.mijnadres.net/published/Monitor%20Object%20Pattern.pdf

    【讨论】:

      【解决方案3】:

      将资源争用与事件通知分开很重要。 Monitor 和 Semaphore 用于限制对共享资源的访问。监视器基本上是一个计数为 1 的信号量。如果您的每个任务都想访问单个 varX,那么您需要使用监视器(或 1 的信号量)来保护它:

      Monitor.Enter 
      // do something with varX
      Monitor.Exit
      

      Semaphore.Acquire
      // do something with varX
      Semaphore.Release
      

      使用信号量,您显然可以将允许的并发参与者的数量设置为共享资源。

      尼克。

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 2011-11-12
        • 1970-01-01
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        相关资源
        最近更新 更多