Pregunta

Se supone que un monitor resuelve problemas con semáforos en entornos concurrentes.
Estoy buscando una buena analogía usando un semáforo de versos de monitor.

Utilice la información para la analogía:
4 tareas (TaskA, TaskB, TaskC, TaskD)
1 variable varX

Cada tarea quiere manipular varX en función de algún evento.

¿Fue útil?

Solución

Digamos que un grupo de pacientes quiere ir a ver a un médico.

Una implementación de semáforo sería que todos estén parados afuera de la puerta de la oficina, tan pronto como salga un paciente, todos traten de pasar, una persona se las arregla para entrar, el resto tiene que esperar nuevamente.

Sería una implementación del monitor, todos los pacientes entrantes son enviados a una sala de espera, se determinará una apariencia de orden y cuando un paciente haya terminado, otro será enviado al médico.

Son básicamente lo mismo, los monitores están más estructurados que los semáforos.

Otros consejos

También puede ver un monitor como un baño público. Una vez que alguien entró y cerró la puerta del baño, la persona que está adentro no quiere que nadie más esté en ese espacio (es decir, el monitor). Todas las demás personas (hilos) tienen que hacer cola frente al inodoro y esperar (esperar ()). Solo después de que la persona dentro haya terminado, sale y la siguiente persona puede entrar.

Algunas de las personas que esperan pueden tener problemas de estreñimiento. Por razones obvias, no quieren entrar o regresar a menos que estén listos para hacer un uso adecuado del inodoro. Aquí es donde quieren esperar (esperar ()) hasta que su estómago les indique (señal ()) que están listos para ir al baño. Antes de que esto suceda, dejan pasar a todos los demás.

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

Es importante separar la contención del recurso de la notificación del evento. Un monitor y un semáforo se utilizan para limitar el acceso a un recurso compartido. Un monitor es básicamente un semáforo cuyo recuento es 1. Si cada una de sus tareas desea obtener acceso a la varX individual, entonces debe protegerla utilizando su monitor (o un segmento de 1):

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

o

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

Con un semáforo, obviamente puede establecer el número de participantes concurrentes permitidos en el recurso compartido.

Nick.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top