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

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

每个任务都希望根据某些事件操纵 varX

有帮助吗?

解决方案

让我们说一群患者想去看医生。

信号量的实施将是他们都站在办公室的门外,一旦一个病人出来,他们都试图挤压,一个人设法进入,其余的人必须再次等待。

显示器的实施方式是,所有入院的患者都会被送到候诊室,一些相似的命令将被确定,当一名患者完成后,另一名患者将被送往医生。

它们基本上是相同的东西,监视器比信号量更有条理。

其他提示

您还可以将显示器视为公共厕所。一旦有人进入关闭厕所门,内部人员不希望其他人进入该空间(即监视器)。所有其他人(线程)必须在马桶前排队等待(等待())。只有在里面的人完成之后,才会出来,下一个人可以进去。

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

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

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

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

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

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

尼克。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top