- - - - CENAPAD-MGCO

A seguir: A solução proposta Starvation Acima: Terceira questão Anterior: Terceira questão


Classe ReadersAndWritersSynchronizer

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);
    }
}



Osvaldo Carvalho - Postscript - Comentários?