-
-
-
CENAPAD-MGCO
A seguir: A solução proposta Starvation Acima: Terceira questão Anterior: Terceira questão
class ReadersAndWritersSynchronizer
{
int nww = 0, // Numero de escritores escrevendo
nw = 0; // Numero de escritores esperando
nrr = 0, // Numero de leitores lendo
nr = 0, // Numero de leitores esperando
k = 0; // Numero de leitores esperando terminar uma escrita
Key mutex;
Bed b;
requestRead()
{
lock(mutex);
nr++;
boolean waiting_update = false;
while ((nww > 0) || ((nw > 0) && (k == 0))
|| ((nw > 0) && (k > 0) && !waiting_update))
{
if (nww > 0)
{
k++;
waiting_update = true;
wait(bw, mutex);
}
else
wait(b, mutex);
}
/* Neste ponto, as tres condicoes abaixo s\~{a}o satisfeitas:
1. Nenhum processo esta escrevendo
2. Se houver escritor esperando,
h\'{a} leitores que tem prioridade maior
3. Se houver leitor com alta prioridade, o leitor corrente a tem
*/
if (waiting_update) k--;
nr--;
nrr++;
wakeup(b, mutex);
unlock(mutex);
}
releaseRead()
{
lock(mutex);
wakeup(b, mutex);
nrr--;
unlock(mutex);
}
requestWrite()
{
lock(mutex);
nw++;
while ((nww > 0) || (nrr > 0) || (k > 0))
wait(b, mutex);
nw--;
nww++;
unlock(mutex);
}
releaseWrite()
{
lock(mutex);
nww--;
wakeup(b, mutex);
unlock(mutex);
}
}