// A re-usable synch barrier. class Barrier{ private: // Synchronization variables Lock lock; CV allCheckedIn; CV allLeaving; // State variables int numEntered; int numLeaving; int numThreads; public: Barrier(int n); ~Barrier(); void checkin(); }; Barrier::Barrier(int n) { numEntered = 0; numLeaving = 0; numThreads = n; } // No one returns until all threads // have called checkin. void checkin() { lock.acquire(); numEntered++; if (numEntered < numThreads) { while (numEntered < numThreads) allCheckedIn.wait(&lock); } else { // no threads in allLeaving.wait numLeaving = 0; allCheckedIn.broadcast(); } numLeaving++; if (numLeaving < numThreads) { while (numLeaving < numThreads) allLeaving.wait(&lock); } else { // no threads in allCheckedIn.wait numEntered = 0; allLeaving.broadcast(); } lock.release(); }