- - - - CENAPAD-MGCO

A seguir: Classes Request e BridgeQueue Acima: Segunda questão Anterior: Segunda questão


Classe BridgeSynchronizer

class BridgeSynchronizer
{
    Key mutex;
    Bed b;
    BridgeQueue waiting;
    int num_carros = 0; // Numero de carros atravessando a ponte
    static int leste = 0; // Constantes inteiras, utilizadas para definir a  
    static int oeste = 1; // direcao dos carros que estao atravessando a ponte
    int direcao_corrente;

    void request(int direcao)
    {
        lock(mutex);
        if (waiting.empty()) 
              // N\~{a}o h\'{a} carros tentando atravessar a ponte
            direcao_corrente = direcao;
        Request rq = waiting.getRequest(direcao);
        while((direcao != direcao_corrente) || !waiting.isTheBest(rq))
            wait(b, mutex);
        num_carros++;
        wakeup(b, mutex); 
          // Da permissao a outros carros que estejam na mesma direcao
        waiting.ok(rq);
        unlock(mutex);
    }

    void release()
    {
        lock(mutex);
        num_carros--;
        if (num_carros == 0 && waiting.top().direcao != direcao_corrente)
            direcao_corrente = 1 - direcao_corrente; // Muda o sentido da ponte
        wakeup(b, mutex);
        unlock(mutex);
    }
}



Osvaldo Carvalho - Postscript - Comentários?