Examen Julio 2013 - Problema 3 (ADA)

Examen Julio 2013 - Problema 3 (ADA)

de Diego Esmir Gonzalez Morales -
Número de respuestas: 5

Se tiene que hay un conjunto de boxes, en ellos, un Auditor no puede ingresar cuando hay un Productor, y el Auditor es prioritario sobre el Productor.

Para controlar el ingreso del Productor, me valgo de una guarda con la condición IngresaAuditor' COUNT <> 0 a modo de ofrecer el ingreso de un Productor sólo si no hay Auditores esperando. ¿Está bien esto? Pregunto porque en la solución el Auditor primero solicita una cita QuieroIngresarAuditor y eso incrementa un contador de los auditores esperando en la tarea Box y en base a ese contador establece si ofrece o no la cita al Productor.

Adjunto mi código por las dudas.

En respuesta a Diego Esmir Gonzalez Morales

Re: Examen Julio 2013 - Problema 3 (ADA)

de Tamara Dalmar Techera Gomez -
https://eva.fing.edu.uy/mod/forum/discuss.php?d=48524


Por lo que intepreté yo de ese post, es que el count "funciona" solamente si la entrada esta abierta, o sea, la condición del when se cumple para esa entrada. Yo pensé que contaba a todos los que esperaban por la entrada, sin importar si se cumplia o no la condición del when (si la entrada estaba cerrada o abierta). Es así? 

Gracias, 

Slds!

En respuesta a Tamara Dalmar Techera Gomez

Re: Examen Julio 2013 - Problema 3 (ADA)

de Diego Esmir Gonzalez Morales -

¡Gracias! No había visto ese post.

Lo que yo entendí fue lo siguiente: supongamos que hay un productor en el sistema, y el box evalúa las guardas, encuentra que no hay ningún auditor que quiera esperar para entrar y que hay un productor en el sistema, por lo que la guarda para ofrecer la cita con el auditor da falso y por tanto no ofrece la cita; pero al guarda con el productor da verdadero y por tanto sí ofrece la cita. Pero, como ningún actor aún solicitó una cita, el box se bloquea, ofreciendo solamente la cita del productor, ya que fue la única cuya guarda dio verdadera.

Rato más tarde, ingresa un auditor, pide la cita, pero ve que el box aún no la ofreció (otra vez: había evaluado su guarda y dio falso), por lo que se bloquea. Luego, viene un productor y solicita la cita, acá sí encuentra que está ofrecida por el box, y entra. Ahí se produjo el error: entró un productor cuando un auditor también quería entrar.

En respuesta a Tamara Dalmar Techera Gomez

Re: Examen Julio 2013 - Problema 3 (ADA)

de Jorge Merlino -

El count cuenta los que esperan en una entrada. No tiene nada que ver con la guarda donde se use.

En respuesta a Jorge Merlino

Re: Examen Julio 2013 - Problema 3 (ADA)

de Tamara Dalmar Techera Gomez -

Pero si al count no le importa si la guarda es valida o no, si llegan al mismo tiempo el Auditor y el Productor, no entiendo por que el Productor hace comenzar_auditoria'count y le da 0. 

Si es porque  "las guardas se evalúan al entrar al SELECT y no se vuelven a evaluar si no se vuelve a entrar al mismo." entiendo, pero en la solución se plantea el uso de una variable cant_auditores_en_Espera = 0. No entiendo por que esto funciona, y lo otro no, porque el productor al entrar estaría viendo la variable = 0, el auditor no la actualizo porque llegaron al mismo tiempo (por la misma razón que no vio el count 0) 

Hay algo que no estoy viendo! Agradezco si me lo pueden explicar porque le estoy dando vueltas hace tiempo.

Gracias,

slds

En respuesta a Tamara Dalmar Techera Gomez

Re: Examen Julio 2013 - Problema 3 (ADA)

de Diego Esmir Gonzalez Morales -

Es que eso de "ingresar al mismo tiempo" es engañoso, ya que en realidad nada sucede al mismo tiempo, siempre uno llega antes que el otro.

Sí, es porque "las guardas se evalúan al entrar al SELECT y no se vuelven a evaluar si no vuelve a entrar al mismo". El por qué funciona el uso de la variable quiereEntrar y la cita QuiereEntrarAuditor es, en el supuesto de antes (que hay un productor en el sistema), lo siguiente:

t = 0: El box evalúa las guardas, y ahora encuentra lo siguiente:

  • QuiereEntrarAuditor no tiene guarda, por lo que siempre lo ofrece
  • entrarProductor encuentra en su guarda que no hay auditores que deseen entrar, por lo que la guarda da verdadero y luego ofrece la cita entrarProductor

t = 1: Ahora quiere ingresar un auditor, pide la cita, y ve que el box sí la ofreció (QuiereEntrarAuditor está ofrecida), y luego, incrementa en uno el contador

t = 2: El box sale del SELECT, y las guardas vuelven a ser evaluadas, encontrando lo siguiente:

  • entrarProductor no se ofrece porque el contador está en un valor mayor a 0
  • entrarAuditor no se ofrece porque aún quedan Productores en el box

Ahora:

Si en t = 1 quiere entrar un Productor en lugar de un Auditor, pide la cita y ve que sí está ofrecida, por lo que entra. Esto no viola que el auditor es prioritario, ya que aún no manifestó su intención de entrar (no pidió cita con QuiereEntrarAuditor).

Si en t = 3 quiere entrar un Productor, encontrará que la cita no está ofrecida (el contador es distinto de 0, y por tanto un Auditor quiere entrar), y por tanto se bloqueará

Si en t = 3 quiere entrar un Auditor, encontrará que la cita no está ofrecida y se bloquea. En cambio, ahora, sucederá que esa cita sí será ofrecida en breve, cuando todos los Productores ya se hayan ido (el tema acá es que no podrán entrar nuevos Productores, como es deseado).


Espero que no haya quedado muy entreverado ;)