[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Exercicios



Ola a todos,
estou tentando fazer uns exercicios do livro, e como nao tem resposta no
livro resolvi pedir ajuda para a lista. Por exemplo, o problema abaixo:

-----------------------------------------------------------------------
Ex 5.7 do livro

The one-lane bridge
Carros provenientes de norte e do sul chegam a uma ponte com uma unica
pista. Carros no mesmo sentido podem atravessar a ponte ao mesmo tempo.
1. Desenvolva uma solucao para este problema. Modele os carros como
processos e use monitores para a sincronizacao. Nao se preoucupe com
justica.
2. Modifique a solucao para garantir justica.
-----------------------------------------------------------------------

A solucao que eu fiz para este problema esta abaixo. Me parece que
funciona, mas queria saber se alguem fez algo parecido ou se acha algum
problema no monitor abaixo.

monitor ControladorDaPonte {
    int count = 0,       # numero de carros na ponte
        sentido = NORTE; # sentido dos carros que estao na ponte (se houver algum)
    cond n, # para segurar carros que estao no norte e querem ir para o sul
         s; # para segurar carros que estao no sul e querem ir para o norte

    procedure paraNorte() {
        if(count == 0) { # se nao tem ninguem na ponte
            sentido = NORTE;
            count++; # libera o carro
        } else if(sentido == NORTE && empty(s)) { # se o sentido atual ja e NORTE
                                                  # e nao tem ninguem esperando no sul
            count++; # libera o carro           
        } else {
            wait(n); # senao espera no norte
        }
    }

    procedure chegaNorte() {
        count--;
        if(count == 0) { # se foi o ultimo carro a chegar
            if(!empty(n)) { # se tem alguem esperando no norte
                while(!empty(n)) { # acorda e libera todo mundo que esta esperando no norte
                    count++;
                    signal(n); 
                }
            } else if(!empty(s)) { # senao se tem alguem esperando no sul
                while(!empty(s)) { # acorda e libera todo mundo que esta esperando no sul
                    count++;
                    signal(s); 
                }
            }
        }
    }

    # os procedimentos paraSul e chegaSul sao simetricos

    procedure paraSul() {
        if(count == 0) { # se nao tem ninguem na ponte
            sentido = SUL;
            count++; # libera o carro
        } else if(sentido == SUL && empty(n)) { # se o sentido atual ja e SUL
                                                # e nao tem ninguem esperando no norte
            count++; # libera o carro           
        } else {
            wait(s); # senao espera no sul
        }
    }

    procedure chegaSul() {
        count--;
        if(count == 0) { # se foi o ultimo carro a chegar
            if(!empty(s)) { # se tem alguem esperando no sul
                while(!empty(s)) { # acorda e libera todo mundo que esta esperando no sul
                    count++;
                    signal(s); 
                }
            } else if(!empty(n)) { # senao se tem alguem esperando no norte
                while(!empty(n)) { # acorda e libera todo mundo que esta esperando no norte
                    count++;
                    signal(n); 
                }
            }
        }
    }
}

Abracos.

-- 
 Ivan Bittencourt de Araujo e S Neto   <ivanneto@linux.ime.usp.br>