-
-
-
CENAPAD-MGCO
A seguir: TicketQueue Acima: Janaina Farnese Lacerda Anterior: TicketQueue
/* variaveis globais */
TicketQueue waitingR, waitingW;
/* waitingR: TicketQueue dos leitores */
/* waitingW: TicketQueue dos escritores */
key mutex;
bed bR, bW;
/* bR: cama de leitores */
/* bW: cama de escritores */
int nR = 0, nW = 0, noR = 0;
/* nR: numero de leitores que estao lendo */
/* nW: numero de escritores que estao escrevendo */
/* noR: numero de leitores que obrigatoriamente devem conseguir ler */
int nbR = 0, nbW = 0;
/* nbR: numero de leitores na cama de leitores */
/* nbW: numero de escritores na cama de escritores */
void writer() {
/* processo associado ao escritor */
requestWrite();
/* escrevendo */
releaseWrite();
}
void reader() {
/* processo associado ao leitor */
requestRead();
/* lendo */
releaseRead();
}
void requestWrite() {
lock(mutex);
int myTicket = waitingW.getTicket();
nbW++;
while((noR > 0) || (nR > 0) || (nW > 0) || (!waitingW.isTheBest(myTicket))) {
wait(bW, mutex);
}
nW++;
nbW--;
noR = nbR;
waitingW.ok(myTicket);
unlock(mutex);
}
void requestRead() {
lock(mutex);
int myTicket = waitingR.getTicket();
nbR++;
if (nW > 0) {
noR++;
}
while(((nW > 0) || (noR == 0) || (!waitingR.isTheBest(myTicket))) &&
((nW > 0) || (noR != 0) || (!waitingR.isTheBest(myTicket)) || (nbW > 0))) {
wait(bR, mutex);
}
nR++;
nbR--;
if (noR > 0) {
noR--;
}
waitingR.ok(myTicket);
wakeup(bR, mutex);
unlock(mutex);
}
void releaseWrite() {
lock(mutex);
nW--;
wakeup(bR, mutex);
wakeup(bW, mutex);
unlock(mutex);
}
void releaseRead() {
lock(mutex);
nR--;
wakeup(bW, mutex);
wakeup(bR, mutex);
unlock(mutex);
}