-
-
-
CENAPAD-MGCO
A seguir: 5a. Questão Acima: Marcelo Bernardes Vieira Anterior: 3a. Questão
Considerações iniciais:
a) Programa cliente:
void cliente() {
if(RequestBarbeiro()) {
// Utiliza recurso
ReleaseBarbeiro();
}
}
b) Controlador da barbearia:
int sentados; key mutex; TicketQueue waiting;
int ocupado=0;
boolean RequestBarbeiro() {
lock(mutex);
if(sentados >= 5) {
unlock(mutex);
return FALSE;
}
int myticket = waiting.GetTicket();
sentados++;
while(waiting.IsTheBest(myticket) || ocupado == 1)
wait(b, mutex);
waiting.Ok(myticket);
sentados--;
ocupado = 1;
unlock(mutex);
}
void ReleaseBarbeiro() {
lock(mutex);
wakeup(b, mutex);
ocupado = 0;
Unlock(mutex);
}
c) Fila de prioridades:
int ticket=0; OrderedQueue q;
int GetTicket() {
q.put(++ticket);
return( ticket );
}
boolean IsTheBest(int ticket) {
return(q.top == NULL || q.top == ticket);
}
void Ok(int ticket) {
if(ticket != q.pop()) {
ERRO;
}
}