Skip to content

Print Zero Even Odd

leetcode

code (semaphore)

#include <semaphore>
#include <functional>

class ZeroEvenOdd {
private:
    int n;
    std::binary_semaphore zero_turn{1}; // zero starts first
    std::binary_semaphore even_turn{0};
    std::binary_semaphore odd_turn{0};

public:
    ZeroEvenOdd(int n) : n(n) {}

    void zero(std::function<void(int)> printNumber) {
        for (int i = 0; i < n; ++i) {
            zero_turn.acquire();           // wait for my turn
            printNumber(0);
            // Decide who prints next based on what the NEXT number will be
            if (i % 2 == 0) {
                odd_turn.release();        // next is odd → odd thread
            } else {
                even_turn.release();       // next is even → even thread
            }
        }
    }

    void odd(std::function<void(int)> printNumber) {
        for (int i = 1; i <= n; i += 2) {
            odd_turn.acquire();            // wait for my turn
            printNumber(i);             // print current next (odd)
            zero_turn.release();           // give turn back to zero
        }
    }

    void even(std::function<void(int)> printNumber) {
        for (int i = 2; i <= n; i += 2) {
            even_turn.acquire();           // wait for my turn
            printNumber(i);             // print current next (even)
            zero_turn.release();           // give turn back to zero
        }
    }
};