public void signalAndAwait() { PhaseDescriptor observedPhase; while (true) { observedPhase = currentPhase; int remaining = observedPhase.remaining; if (remaining <= 0) { throw new InvalidOperationException(); } if (Interlocked.CompareExchange(ref currentPhase.remaining, remaining - 1, remaining) == remaining) { if (remaining == 1) { currentPhase = new PhaseDescriptor(partners); return; } else { break; } } } while (observedPhase == currentPhase) { Thread.Yield(); } }
public SafeCyclicBarrierOk(int partners) { if (partners <= 0) { throw new ArgumentException(); } this.partners = partners; currentPhase = new PhaseDescriptor(partners); }