Exemple d'implantation d'une barriere

Pour implanter une Barriere, on peut partir du mecanisme precedent d'objet de classe Canal et le modifier en y ajoutant un mecanisme de Moniteur.

A la creation de la Barriere, on indique combien de processus doivent se synchroniser.

Applet (secouer la souris !) :

Programme (corps de la barriere) :

class Barriere

{

    private int quota, en_attente, parti ;

    private com3 mon_pere ;

    private boolean autorise_entree ;

    Barriere(com3 pere, int combien)

    {

      mon_pere = pere ;

      quota = combien ; // combien doit-on synchroniser de processus ?

      en_attente = 0 ; // combien sont deja arrives ?

      parti = 0 ; // combien sont deja partis ?

      autorise_entree = true ; // peut-on entrer en section critique de la barriere ?

    }

    public synchronized void arrive_barriere()

    {

      if (! autorise_entree) mon_pere.erreur(new StringBuffer("Barriere : entree interdite !")) ;

      else

      {

        en_attente ++ ;

        if (en_attente == quota) autorise_entree = false ;

        while (en_attente<quota)

        {

          try { wait() ; } catch (InterruptedException e) {}

        }

        notifyAll() ; parti ++ ;

        if (parti==en_attente) { parti = 0 ; en_attente = 0 ; autorise_entree = true ; }

      }

    }

}


Ph. RIS 1997