监视器应该解决并发环境中的信号量问题。
我正在寻找一个使用监视器与信号量的好类比。
请使用类比信息:
4 个任务(TaskA、TaskB、TaskC、TaskD)
1 个变量varX
每个 Task 都想根据某个事件来操作varX 。
监视器应该解决并发环境中的信号量问题。
我正在寻找一个使用监视器与信号量的好类比。
请使用类比信息:
4 个任务(TaskA、TaskB、TaskC、TaskD)
1 个变量varX
每个 Task 都想根据某个事件来操作varX 。
假设有一群病人想去看医生。
一个信号量的实现是他们都站在办公室的门外,一个病人一出来,他们都想挤过去,一个人设法进去,剩下的又要等待。
监控器的实现是,所有进来的病人都被送到候诊室,一些相似的顺序将被确定,当一个病人完成后,另一个病人将被送到医生那里。
它们基本上是一样的,监视器比信号量更结构化。
您还可以将监视器视为公共厕所。一旦有人进入关闭的厕所门,里面的人不希望其他人进入那个空间(即监视器)。所有其他人(线程)都必须在厕所前排队等待(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
使用信号量,您显然可以将允许的并发参与者的数量设置为共享资源。
缺口。