-
-
-
CENAPAD-MGCO
A seguir: Classes Request e BridgeQueue Acima: Segunda questão Anterior: Segunda questão
class BridgeSynchronizer
{
Key mutex;
Bed b;
BridgeQueue waiting;
int num_carros = 0; // Numero de carros atravessando a ponte
static int leste = 0; // Constantes inteiras, utilizadas para definir a
static int oeste = 1; // direcao dos carros que estao atravessando a ponte
int direcao_corrente;
void request(int direcao)
{
lock(mutex);
if (waiting.empty())
// N\~{a}o h\'{a} carros tentando atravessar a ponte
direcao_corrente = direcao;
Request rq = waiting.getRequest(direcao);
while((direcao != direcao_corrente) || !waiting.isTheBest(rq))
wait(b, mutex);
num_carros++;
wakeup(b, mutex);
// Da permissao a outros carros que estejam na mesma direcao
waiting.ok(rq);
unlock(mutex);
}
void release()
{
lock(mutex);
num_carros--;
if (num_carros == 0 && waiting.top().direcao != direcao_corrente)
direcao_corrente = 1 - direcao_corrente; // Muda o sentido da ponte
wakeup(b, mutex);
unlock(mutex);
}
}