-
-
-
CENAPAD-MGCO
A seguir: 4a. Questao Acima: Cristiano Ligieri Pereira Anterior: 2a Questão
TicketQueue wq, /* writers queue */
rq; /* readers queue */
Bed wbed, /* writers bed */
rbed; /* readers bed */
int nr, /* number of readers in the critical section */
nw, /* number of writers in the critical section */
nrww; /* number of readers waiting a writer on the writes queue */
Key mutex;
void requestRead() {
lock(mutex);
int myticket = rq.getTicket();
if (wq.count() > 0) {
nrww++;
wait(rbed, mutex);
}
while (nw > 0 || ! rq.isTheBest(myticket))
wait(rbed, mutex);
nr++;
rq.ok(myticket);
unlock(mutex);
}
void requestWrite() {
lock(mutex);
int myticket = rw.getTicket()
while ((nr + nw + nrww) > 0 || ! wq.isTheBest(myticket))
wait(wbed, mutex);
nw++;
wq.ok(myticket);
unlock(mutex);
}
void releaseRead() {
lock(mutex);
nr--;
if (nrww > 0) {
nrww--;
wakeup(rbed, mutex);
}
else if (rw.count() > 0)
wakeup(wbed, mutex);
else
wakeup(rbed, mutex);
unlock(mutex);
}
void releaseWrite() {
lock(mutex);
nw--;
if (nrww > 0) {
nrww--;
wakeup(rbed, mutex);
}
else if (rw.count() > 0)
wakeup(wbed, mutex);
else
wakeup(rbed, mutex);
unlock(mutex);
}
OBS: A implementacao da fila de tickets eh identica a implementacao da fila de tickets da questao anterior. Devemos apenas assumir que cada instancia da fila possue variaveis locais "ticket" e "q".
possui
A solucao nao esta sujeita a starvation devido ao uso de uma fila de tickets que garante a todos processo ganho do recurso em um tempo finito, nao permitindo assim que processos leitores conspirem contra processos escritores ou vice-versa. Alem disso, quando um processo escritor entra na fila de espera, nenhum outro processo leitor podera ganhar o recurso ate que o mesmo seja atendido e saia da secao critica.