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 ;)