[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Exercicios
Ola a todos,
estou tentando fazer uns exercicios do livro, e como nao tem resposta no
livro resolvi pedir ajuda para a lista. Por exemplo, o problema abaixo:
-----------------------------------------------------------------------
Ex 5.7 do livro
The one-lane bridge
Carros provenientes de norte e do sul chegam a uma ponte com uma unica
pista. Carros no mesmo sentido podem atravessar a ponte ao mesmo tempo.
1. Desenvolva uma solucao para este problema. Modele os carros como
processos e use monitores para a sincronizacao. Nao se preoucupe com
justica.
2. Modifique a solucao para garantir justica.
-----------------------------------------------------------------------
A solucao que eu fiz para este problema esta abaixo. Me parece que
funciona, mas queria saber se alguem fez algo parecido ou se acha algum
problema no monitor abaixo.
monitor ControladorDaPonte {
int count = 0, # numero de carros na ponte
sentido = NORTE; # sentido dos carros que estao na ponte (se houver algum)
cond n, # para segurar carros que estao no norte e querem ir para o sul
s; # para segurar carros que estao no sul e querem ir para o norte
procedure paraNorte() {
if(count == 0) { # se nao tem ninguem na ponte
sentido = NORTE;
count++; # libera o carro
} else if(sentido == NORTE && empty(s)) { # se o sentido atual ja e NORTE
# e nao tem ninguem esperando no sul
count++; # libera o carro
} else {
wait(n); # senao espera no norte
}
}
procedure chegaNorte() {
count--;
if(count == 0) { # se foi o ultimo carro a chegar
if(!empty(n)) { # se tem alguem esperando no norte
while(!empty(n)) { # acorda e libera todo mundo que esta esperando no norte
count++;
signal(n);
}
} else if(!empty(s)) { # senao se tem alguem esperando no sul
while(!empty(s)) { # acorda e libera todo mundo que esta esperando no sul
count++;
signal(s);
}
}
}
}
# os procedimentos paraSul e chegaSul sao simetricos
procedure paraSul() {
if(count == 0) { # se nao tem ninguem na ponte
sentido = SUL;
count++; # libera o carro
} else if(sentido == SUL && empty(n)) { # se o sentido atual ja e SUL
# e nao tem ninguem esperando no norte
count++; # libera o carro
} else {
wait(s); # senao espera no sul
}
}
procedure chegaSul() {
count--;
if(count == 0) { # se foi o ultimo carro a chegar
if(!empty(s)) { # se tem alguem esperando no sul
while(!empty(s)) { # acorda e libera todo mundo que esta esperando no sul
count++;
signal(s);
}
} else if(!empty(n)) { # senao se tem alguem esperando no norte
while(!empty(n)) { # acorda e libera todo mundo que esta esperando no norte
count++;
signal(n);
}
}
}
}
}
Abracos.
--
Ivan Bittencourt de Araujo e S Neto <ivanneto@linux.ime.usp.br>