VAR colaAutos,colaBarcos,autosCruzando,CantLimiteAutosCruzando: Integer; barcoCruzando:Boolean; mutex: Semaphore; /* binario */ barco_entrada,barco_salida,auto_entrada,auto_salida: Semaphore; /* de conteo */ Procedure Puente BEGIN While TRUE DO if (colaBarcos > 0) Then if (autosCruzando = 0) then levantar_puente(); if (!barcoCruzando) then p(mutex); colaBarcos = colaBarcos - 1; barcoCruzando = TRUE; v(mutex); v(barco_entrada); p(barco_salida); end end if else if (!barcoCruzando) then bajar_puente(); if (colaAutos > 0) then if (autosCruzando < CantLimiteAutosCruzando) then p(mutex); colaAutos = colaAutos - 1; autosCruzando = autosCruzando + 1; v(mutex); v(auto_entrada); p(auto_salida); end if end if end if end if end while END Procedure Barco BEGIN p(mutex); /* Sumo uno a la cola de barcos */ colaBarcos = colaBarcos + 1; v(mutex); /* pido para cruzar */ p(barco_entrada); delay(x); /* aviso que termine de cruzar */ v(barco_salida); p(mutex); barcoCruzando = FALSE; v(mutex); END Procedure Auto BEGIN p(mutex); /* Sumo uno a la cola de autos */ colaAutos = colaAutos + 1; v(mutex); /* pido para cruzar */ p(auto_entrada); delay(x); /* aviso que termine de cruzar */ v(auto_salida); p(mutex); autosCruzando = autosCruzando - 1; v(mutex); END /* PRINCIPAL */ BEGIN colaAutos = 0; colaBarcos = 0; autosCruzando = 0; CantLimiteAutosCruzando = N /* numero maximo de autos que puede haber al mismo tiempo en el puente */ barcoCruzando = FALSE; Init(barco_entrada,0); Init(barco_salida,0); Init(auto_entrada,0); Init(auto_salida,0); Init(mutex,1); COBEGIN Puente() Auto() . . Auto() Barco() . . Barco() COEND END