
class ZeroEvenOdd {
private:
int n;
pthread_mutex_t mutexZero,mutexOdd,mutexEven;
public:
ZeroEvenOdd(int n) {
this->n = n;
pthread_mutex_init(&mutexZero,nullptr);
pthread_mutex_init(&mutexOdd,nullptr);
pthread_mutex_init(&mutexEven,nullptr);
pthread_mutex_lock(&mutexOdd);
pthread_mutex_lock(&mutexEven);
}
void zero(function<void(int)> printNumber) {
for(int i=1;i<=this->n;++i){
pthread_mutex_lock(&mutexZero);
printNumber(0);
if(i%2)
pthread_mutex_unlock(&mutexOdd);
else
pthread_mutex_unlock(&mutexEven);
}
}
void even(function<void(int)> printNumber) {
for(int i=2;i<=this->n;i+=2){
pthread_mutex_lock(&mutexEven);
printNumber(i);
pthread_mutex_unlock(&mutexZero);
}
}
void odd(function<void(int)> printNumber) {
for(int i=1;i<=this->n;i+=2){
pthread_mutex_lock(&mutexOdd);
printNumber(i);
pthread_mutex_unlock(&mutexZero);
}
}
};