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
}
}
};