-
-
-
CENAPAD-MGCO
A seguir: 4a Questão Acima: Sidney Batista Filho Anterior: 2a Questao
class CReaderWriter {
Key Mutex; CBed Bed;
TicketQueue Waiting;
boolean ReadPriority = false;
int nrwaiting = 0;
void RequestWrite() {
Lock(Mutex);
int MyTicket = Waiting.GetTicket();
while((nr>0) || (nw>0) || (!Waiting.IsTheBest(MyTicket)) ||
(ReadPriority)) {
Wait(Bed, Mutex);
}
nw++;
Waiting.Ok(MyTicket);
Unlock(Mutex);
}
void RequestRead() {
Lock(Mutex);
int MyTicket = Waiting.GetTicket();
nrwaiting++;
while ((nw>0) || (!Waiting.IsTheBest(MyTicket) && !ReadPriority)) {
Wait(Bed, Mutex);
}
nrwaiting--;
nr++;
Waiting.Ok(MyTicket);
Wakeup(Bed, Mutex);
Unlock(Mutex);
}
void ReleaseWrite() {
Lock(Mutex);
nw--;
ReadPriority = true;
Wakeup(Bed, Mutex);
Unlock(Mutex);
}
void ReleaseRead {
Lock(Mutex);
nr--;
if (nrwaiting == 0)
ReadPriority = false;
Wakeup(Bed, Mutex);
Unlock(Mutex);
}
} // CReaderWriter
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) {
q.Del(Ticket);
}
} // TicketQueue
Observacoes: