resource resourcebarriere2 # Anzahl Prozesse als Parameter bei Instanzierung # Als resource, damit man # a) auch mehrere Barrieren im Programm verwenden kann # (sonst: globale Semaphore, scheitert bei mehrfacher Verwendung) # b) die Zahl der Prozesse Parameter bei Instanzierung sein kann # (globals haben keine Parameter) # Aufruf: barrier(meine ID zw. 0 und n-1, n) op barrier(int myid, int n) body resourcebarriere2(int n) # privates Feld von Barrierensemaphoren sem b[0:n-1] = ([n] 0); # Barriere proc barrier(myid,n) { int pos = 1 # Bitwertigkeiten # Ankunftsphase while ( (myid / pos) % 2 == 0 and pos < n) { P (b[myid]) # Warte auf Partner pos *= 2 } if (myid != 0) { V(b[myid-pos]) # Melde Ankunft an Partner P(b[myid]) } # Abgangsphase while (pos > 1) { pos /= 2 V(b[myid+pos]); } } end resourcebarriere2