Concurrency 寻找监视器与信号量的良好类比/示例

Concurrency 寻找监视器与信号量的良好类比/示例,concurrency,synchronization,shared-memory,semaphore,Concurrency,Synchronization,Shared Memory,Semaphore,监视器应该能够解决并发环境中的信号量问题。 我正在寻找一个很好的类比,使用监视器和信号量。 请使用信息进行类比: 4项任务(任务A、任务B、任务C、任务D) 1变量varX 每个任务都希望基于某个事件操纵varX。假设一群患者想去看医生 信号灯的实现是,他们都站在办公室门外,一旦一个病人出来,他们都试图挤过去,一个人设法进去,其他人不得不再次等待 监护仪的实施方式是,将所有进入的患者送往候诊室,确定一些秩序的表面,当一名患者完成后,另一名患者将被送往医生 它们基本上是一样的,监视器的结构比信号量

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

请使用信息进行类比:
4项任务(任务A、任务B、任务C、任务D)
1变量varX


每个任务都希望基于某个事件操纵varX。

假设一群患者想去看医生

信号灯的实现是,他们都站在办公室门外,一旦一个病人出来,他们都试图挤过去,一个人设法进去,其他人不得不再次等待

监护仪的实施方式是,将所有进入的患者送往候诊室,确定一些秩序的表面,当一名患者完成后,另一名患者将被送往医生


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

将资源争用从事件通知中分离出来很重要。监视器和信号量用于限制对共享资源的访问。监视器基本上是一个计数为1的信号量。如果每个任务都希望访问单个varX,则需要使用监视器(或sempahore of 1)对其进行保护:

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


尼克。

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

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


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

或者,信号灯是门上的锁,而监视器是整个房间(由锁管理)。相同的想法,不同的视角。
Monitor.Enter 
// do something with varX
Monitor.Exit
Semaphore.Acquire
// do something with varX
Semaphore.Release