Existirá un proceso por cada una de las barreras que es necesario controlar. Estos procesos sólo se preocuparán de que un coche llegue hasta la barrera que controla ( EsperarLlegada) y permitir su paso a través de dicha puerta ( DarPaso).
Lo siguiente es diseñar un recurso compartido por estos procesos y que permita gestionar el aparcamiento. Cuando un coche quiere acceder o abandonar el aparcamiento, el proceso que controla la barrera debe notificar de este hecho modificando el recurso.
El grafo de procesos resultante es el siguiente:
En este grafo podemos apreciar que el recurso compartido se encapsula en un monitor para que su acceso se realice en exclusión mutua, la operación Entrar modifica el recurso marcando como ocupada una nueva plaza; mientras que la operación Salir libera una plaza ocupada.
El código de los procesos es el siguiente:
Para manejar el aparcamiento, se puede suponer que está definido el tipo Aparcamientos (que no es más que un contador) con tres operaciones básicas: Lleno, OcuparPlaza y LiberarPlaza. El nucleo de la operación del monitor Entrar es la sentencia OcuparPlaza(parking) y el nucleo de la operación Salir es LiberarPlaza(parking).
Vamos a hacer un estudio de las condiciones de bloqueo y desbloqueo sin tener en cuenta el tema de los turnos en las puertas cuando el aparcamiento se llena.
Podemos obviar la precondición de la operación Salir puesto que es imposible detectar una llegada si no hay coches en el aparcamiento.
Y finalmente el código del monitor es el siguiente:
Analicemos el problema de la entrada por turnos. Supongamos que el aparcamiento se llena y las dos barreras de entrada detectan la llegada de coche, uno de los dos procesos ejecuta antes la operación Entrar y queda bloqueado el primero en la variable permisoEntrar. Cuando salga un coche, el proceso que controla la barrera por la que sale, ejecutará el Continue despertando al primer proceso que se bloqueo que dará entrada a un coche por dicha barrera. En ese momento el proceso que controla la otra barrera de entrada es el primero en la cola permisoEntrar y si otro coche intenta entrar por la otra barrera, será ese proceso el que ocupe el segundo lugar. Por lo tanto la solución anterior es válida al atender por turnos la entrada de coches si el aparcamiento está lleno.
En el caso en el que el número de barreras de entrada fuera mayor que 2 es necesario que el bloqueo se realice en colas permisoEntrar[i] parametrizadas por el número de la entrada, haciendose necesario notificar el bloqueo de cada uno de los procesos con un vector de booleanos.
A pesar de todo, el código de bloqueo no se modifica en absoluto, puesto que es en el código de desbloqueo en el que se tiene en cuenta la prioridad en el despertar (turnos) cuando el aparcamiento se llena.