-
-
-
CENAPAD-MGCO
A seguir: Questao 3 Acima: Sahira Vieira de Miranda Anterior: Questao 1
Carro i:
...
RequestBridge(destino);
/* Atravessa a ponte */
ReleaseBridge(destino);
...
# define oeste 0
# define leste 1
Key mutex;
Bed b;
int ncdo = 0; //numero de carros com destino a oeste na ponte
int ncdl = 0; //numero de carros com destino a leste na ponte
void RequestBridge(int destino){
lock(mutex)
if (destino == oeste)
while (ncdl > 0)
wait(b, mutex);
ncdo++;
}
else if (destino == leste){
while (ncdo > 0)
wait(b, mutex);
ncdl++;
}
wakeup(b, mutex);
unlock(mutex);
}
void ReleaseBridge(int destino){
lock(mutex);
if (destino == oeste) ncdo--;
else if (destino == leste) ncdl--;
wakeup(b, mutex);
unlock(mutex);
}
Esta solucao possui as seguintes propriedades de invariancia: 1) Nunca teremos dois ou mais carros em sentidos opostos na ponte em um dado instante de tempo 2) Nunca teremos uma espara circular, configurando um deadlock
No entanto, esta solucao não e uma solucao justa, uma vez que alguns processos podem morrer de inanicao. Esta situacao deve-se ao fato de que um veiculo com destino a leste (oeste) pode esperar indefinidamente enquanto veiculos com destino a oeste (leste) vao se revezando no uso da ponte.