-
-
-
CENAPAD-MGCO
A seguir: 4a Questão Acima: Gabarito Anterior: 2a Questão
Bed rBed, wBed;
Key mutex;
int nw = 0, nr = 0, nwwaiting = 0;
Ticket readersMaxTicket = new Ticket(0);
TicketQueue rQueue;
void requestRead() {
lock(mutex) {
Ticket myTicket = rQueue.getTicket();
while( (nw > 0) || (nwwaiting > 0 &&
myTicket.greaterThan(readersMaxTicket))) {
wait(rBed, mutex);
}
nr++;
rQueue.ok(myTicket);
unlock(mutex);
}
void requestWrite() {
lock(mutex);
nwwaiting++;
while ( (nw > 0) || (nr > 0) ||
rQueue.minTicket().greaterThan(readersMaxTicket) ) {
wait(wBed, mutex);
}
nwwaiting--;
nw++;
unlock(mutex);
}
void releaseRead() {
lock(mutex);
nr--;
if(nr == 0) wakeup(wBed, mutex);
unlock(mutex);
}
void releaseWrite() {
lock(mutex);
nw--;
readersMaxTicket = rQueue.maxTicket;
wakeup(rBed, mutex);
wakeup(wBed, mutex);
unlock(mutex);
}
Esta solução não tem problemas de starvation para os leitores, que têm sua espera limitada a uma operação de escrita. Processos escritores podem entretanto ser vítimas de uma conspiração de outros escritores. A solução seria adotar tickets também para os escritores.