-
-
-
CENAPAD-MGCO
A seguir: 5a Questão Acima: Sidney Batista Filho Anterior: 3a Questão
Processo barbeiro:
...
loop
BarberShop.RequestClient();
/* corta o cabelo */
BarberShop.ReleaseClient();
endloop
...
Processos Clientes:
...
boolean IsFull;
IsFull = BarberShop.RequestBarber();
if (!IsFull) {
/* corta o cabelo */
BarberShop.ReleaseBarber();
}
...
class CBarberShop {
Key Mutex;
CBed ClientBed, BarberBed;
int n = 5; // no. de cadeiras para os clientes esperarem
int ClientWaiting = 0; // no. de clientes que estao esperando
boolean Busy = false; // indica se o barbeiro esta atendendo um cliente
TicketQueue Waiting;
void RequestClient() {
Lock(Mutex);
while(ClientWaiting == 0) {
Wait(BarberBed, Mutex);
}
ClientWaiting--;
Unlock(Mutex);
}
void ReleaseClient() {
}
boolean RequestBarber() {
boolean IsFull;
Lock(Mutex);
IsFull = ClientWaiting == n;
if (!IsFull) {
ClientWaiting++;
int MyTicket = Waiting.GeTicket();
while((Busy) || (!Waiting.IsTheBest(MyTicket))) {
Wait(ClientBed, Mutex);
}
Busy = true;
Wakeup(BarberBed, Mutex);
Waiting.Ok(MyTicket);
}
Unlock(Mutex);
return IsFull;
}
void ReleaseBarber() {
Lock(Mutex);
Busy = false;
Wakeup(ClientBed, Mutex);
Unlock(Mutex);
}
} // CBarberShop
class TicketQueue {
int Ticket = 0;
OrderedQueue q;
int GetTicket() {
q.Put(++Ticket);
return Ticket;
}
boolean IsTheBest(int Ticket) {
return Ticket == q.Top();
}
void Ok(int Ticket) {
if (Ticket != q.Pop()) {
ERRO!
}
}
} // TicketQueue