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