3

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

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

每个 Task 都想根据某个事件来操作varX 。

4

3 回答 3

7

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

一个信号量的实现是他们都站在办公室的门外,一个病人一出来,他们都想挤过去,一个人设法进去,剩下的又要等待。

监控器的实现是,所有进来的病人都被送到候诊室,一些相似的顺序将被确定,当一个病人完成后,另一个病人将被送到医生那里。

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

于 2009-05-07T18:43:14.043 回答
2

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

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

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

于 2012-09-02T01:34:22.297 回答
1

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

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

或者

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

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

缺口。

于 2009-07-24T12:37:42.933 回答