-
-
-
CENAPAD-MGCO
A seguir: Questao 4 Acima: Sahira Vieira de Miranda Anterior: Questao 2
Escritor:
...
RequestWrite( );
/* escreve */
ReleaseWrite( );
...
Leitor:
...
RequestRead( );
/* le */
ReleaseReda( );
...
Key mutex;
Boolean bloqueado = false;
Int nr = 0; // Numero de leitores lendo
Int nw = 0; // Numero de escritores escrevendo
Int rw = 0; // Numero de leitores esperando para ler
Int ww = 0; // Numero de escritores esperando para escrever
Bed br, bw; // camas dos leitores e escritores
void RequestWrite(){
lock(mutex)
ww++;
while (rw > 0) wait (bw, mutex);
while (nr > 0 || nw > 0) wait(bw, mutex);
nw++;
ww--;
unlock(mutex);
}
void RequestRead(){
lock(mutex)
if (bloqueado) wait(br, mutex);
rw++;
if (ww > 0) wait (br, mutex);
while (nw > 0) wait(br, mutex);
nr++;
rw--;
unlock(mutex);
}
void ReleaseWrite( ){
lock(mutex);
nw--;
if (rw > 0) {
wakeup(br, mutex);
bloqueado = true;
}
else
wakeup(bw, mutex);
unlock(mutex);
}
void ReleaseRead( ){
lock(mutex);
nr--;
if (nr == 0) {
bloqueado = false;
if (ww > 0)
wakeup(bw, mutex);
else
wakeup(br, mutex);
}
unlock(mutex);
}
Sim. Uma vez que esta solucao não garante que os escritores sejam atendidos na ordem em que chegam, pode ocontecer de um escritor esperar indefinidamente. Isso ocorre quando um novo escritor e atendido antes dos que chegaram antes dele. Este problema poderia ser resolvido implementando uma politica de escalonamento. Com os leitores este problema não ocorre uma vez que um leitor so vai esperar se tiver algum escritor escrevendo, e o primeiro escritor que conseguir escrever fara com que todos os leitores que estavam esperando leiam. Assim sendo, assumindo que os escritores escrevem em tempo finito, os leitores tambem conseguirao ler em tempo finito.