-
-
-
CENAPAD-MGCO
A seguir: 4a Questão Acima: Elaine Gouvea Pimentel Anterior: 2a Questão
int nW = 0; /* Numero de escritores */
int nR = 0; /* Numero de leitores */
int nRw = 0; /* Numero de leitores esperando */
int nWw = 0; /* Numero de escritores esperando;
/* Criamos uma fila de espera para leitores e outra para escritores */
Queue waitingW;
Queue waitingR;
/* Escritores s\'{o} podem entrar na fila de espera caso exista um escritor
escrevendo
ou caso nao haja leitores ou escritores na fila; isso garante prioridade de
leitura
para leitores que estao na fila */
void requestWrite(int myTicket){
if nW > 0 || ((nRw = 0) && (nWw = 0)) {
lock(mutex);
int myTicketW = getTicketW();
if nW > 0 {
nWw++;
}
while (nW > 0) || (nR > 0) || (!isTheBestW(myTicketW)) || (nRw > 0){
wait(b, mutex);
}
nW ++;
okW(myTicketW);
unlock(mutex);
}
}
void releaseWrite(myTicket){
lock(mutex);
nW --;
if nWw > 0{
nWw--;
}
okW(myTicketW);
wakeup (b, mutex);
unlock(mutex);
}
Leitores só podem entrar na fila de espera caso haja um escritor escrevendo ou nao existam leitores nem escritores na fila; isso garante que nao haja starvation nos writes, ou seja, a fila de leitores é sempre finita
void requestRead(){
if (nW > 0) || ((nRw = 0) && (nWw > 0)){
lock(mutex);
int myTicketR = getTicketR();
if (nW > 0){
nRw ++;
}
while (nW > 0) || (!isTheBestR(myTicketR)) {
wait(b, mutex);
}
nR ++;
okR(myTicketR);
wakeup(b, mutex);
unlock(mutex);
}
}
void releaseRead(){
lock(mutex);
nR--;
if nRw > 0 {
nR--;
}
wakeup(b, mutex);
unlock(mutex);
}
Os procedimentos getTicketW, getTicketR, okW, okR, isTheBestW e isTheBestR sao similares aos dados em sala de aula, e utilizam as filas waitingW e waitingR
A solução proposta não tem problemas de starvation uma vez que, assim que o primeiro write da fila de espera e é executado, todos os leitores que estão na fila de espera são obrigados a ler. Então todos os writes restantes também são obrigados a ser executados e a fila fica vazia. Então o processo se reinicia.