-
-
-
CENAPAD-MGCO
A seguir: TicketQueue Acima: Janaina Farnese Lacerda Anterior: TicketQueue
#define n 20
/* variaveis globais */
TicketQueue waiting;
key mutex;
bed b\c{C} bB;
/* bC: cama dos clientes */
/* bB: cama do barbeiro */
int nC = 0, nB = 1;
/* nC: numero de clientes que estao sendo atendidos pelo barbeiro (0 ou 1) */
/* nB: numero de barbeiros que estao atendendo clientes (0 ou 1) */
int nbC = 0;
/* nbC: numero de clientes na cama */
void barber() {
/* processo associado ao barbeiro */
while (true) {
requestClient();
/* atendendo um cliente */
releaseClient();
}
}
void client() {
/* processo associado a um cliente */
requestBarber();
/* sendo atendido pelo barbeiro */
releaseBarber();
}
void requestClient() {
lock(mutex);
if (nbC == 0) {
nB--;
wait(bB, mutex);
}
nB++;
wakeup(b\c{C} mutex);
unlock(mutex);
}
void requestBarber() {
lock(mutex);
if (nbC < n) {
int myTicket = waiting.getTicket();
if (nbC == 0) {
wakeup(bB, mutex);
}
nbC++;
while ((nC > 0) || (nB == 0)
|| (!waiting.isTheBest(myTicket))) {
wait(b\c{C} mutex);
}
nC++;
nbC--;
waiting.ok(myTicket);
}
unlock(mutex);
}
void releaseClient() {
lock(mutex);
nC--;
wakeup(b\c{C} mutex);
unlock(mutex);
}
void releaseBarber() { }