// printNumber(x) outputs "x", where x is an integer. voidzero(function<void(int)> printNumber){ for (int i = 1; i <= n; ++i) { mtx1.lock(); printNumber(0); if (i & 1) mtx3.unlock(); else mtx2.unlock(); } }
voideven(function<void(int)> printNumber){ for (int i = 2; i <= n; i+=2) { mtx2.lock(); printNumber(i); mtx1.unlock(); } }
voidodd(function<void(int)> printNumber){ for (int i = 1; i <= n; i+=2) { mtx3.lock(); printNumber(i); mtx1.unlock(); } } };
public: ZeroEvenOdd(int n) { this->n = n; ze = false; other = true; }
// printNumber(x) outputs "x", where x is an integer. voidzero(function<void(int)> printNumber){ for (int i = 1; i <= n; ++i) { std::unique_lock<std::mutex> lk(mtx); cv.wait(lk, [=](){ return !ze && other; }); printNumber(0); if (i & 1) ze = true; else other = false; cv.notify_all(); } }
voideven(function<void(int)> printNumber){ for (int i = 2; i <= n; i+=2) { std::unique_lock<std::mutex> lk(mtx); cv.wait(lk, [=](){ return !ze && !other; }); printNumber(i); ze = false; other = true; cv.notify_all(); } }
voidodd(function<void(int)> printNumber){ for (int i = 1; i <= n; i+=2) { std::unique_lock<std::mutex> lk(mtx); cv.wait(lk, [=](){ return ze && other; }); printNumber(i); ze = false; cv.notify_all(); } } };