# # Programme developpe par Guy Tremblay, Professeur au dept. d'informatique # dans le cadre du cours INF7440. # (Automne 2002, 2003, 2004) # resource Barriere # Operation pour mise en attente a la barriere. op attendre() # Le nombre de processus impliques dans l'attente a la barriere est # specifie au moment de la creation de la ressource (parametre nbProcs). body Barriere( int nbProcs ) int nbArrives = 0; int semAttenteActif = 0; sem semMutex = 1; sem semAttente[0:1] = ([2] 0); procedure prochainSemAttente( int n1 ) returns int r # Permet d'alterner entre semAttente[0] et semAttente[1] { r = 1 - n1; } proc attendre() { P(semMutex); nbArrives += 1; if (nbArrives < nbProcs) { # Il reste encore d'autres processus qui ne sont pas arrives # => Mise en attente sur le semaphore semAttente actif. int actif = semAttenteActif; V(semMutex); P(semAttente[actif]); } else { # Tous les processus sont maintenant arrives # => On les reactive nbArrives = 0; for [i = 1 to nbProcs-1] { V(semAttente[semAttenteActif]); } semAttenteActif = prochainSemAttente(semAttenteActif); V(semMutex) } } end