【发布时间】:2010-10-24 14:12:23
【问题描述】:
监视器应该解决并发环境中的信号量问题。
我正在寻找一个使用监视器与信号量的好类比。
请使用类比信息:
4 个任务(TaskA、TaskB、TaskC、TaskD)
1 个变量 varX
每个任务都想根据某个事件来操作 varX。
【问题讨论】:
标签: concurrency synchronization shared-memory semaphore
监视器应该解决并发环境中的信号量问题。
我正在寻找一个使用监视器与信号量的好类比。
请使用类比信息:
4 个任务(TaskA、TaskB、TaskC、TaskD)
1 个变量 varX
每个任务都想根据某个事件来操作 varX。
【问题讨论】:
标签: concurrency synchronization shared-memory semaphore
假设有一群病人想去看医生。
信号量的实现是他们都站在办公室门外,一个病人一出来,他们都想挤过去,一个人设法进去,其余的人必须再等。
监视器实现是,所有入院患者都被送到候诊室,将确定一些相似的顺序,当一名患者完成后,另一名患者将被发送给医生。
它们基本上是一样的,只是监视器比信号量更结构化。
【讨论】:
您还可以将监视器视为公共厕所。一旦有人进入关闭的厕所门,里面的人就不希望其他人进入那个空间(即监视器)。所有其他人(线程)都必须在厕所前排队等待(wait())。里面的人做完,出来后,下一个人才能进去。
有些等待的人可能有便秘问题。出于显而易见的原因,除非他们准备好正确使用厕所,否则他们不想进去或返回。这是他们想要等待(wait())的地方,直到他们的胃向他们发出信号(signal())他们准备好去厕所了。在这发生之前,他们让其他人通过。
来源:www.mijnadres.net/published/Monitor%20Object%20Pattern.pdf
【讨论】:
将资源争用与事件通知分开很重要。 Monitor 和 Semaphore 用于限制对共享资源的访问。监视器基本上是一个计数为 1 的信号量。如果您的每个任务都想访问单个 varX,那么您需要使用监视器(或 1 的信号量)来保护它:
Monitor.Enter
// do something with varX
Monitor.Exit
或
Semaphore.Acquire
// do something with varX
Semaphore.Release
使用信号量,您显然可以将允许的并发参与者的数量设置为共享资源。
尼克。
【讨论】: