classZeroEvenOdd{
private:int n;
pthread_mutex_t mutex0;
pthread_mutex_t mutex1;
pthread_mutex_t mutex2;public:ZeroEvenOdd(int n){
this->n = n;pthread_mutex_init(&mutex0,NULL);pthread_mutex_init(&mutex1,NULL);pthread_mutex_init(&mutex2,NULL);//lockpthread_mutex_lock(&mutex1);pthread_mutex_lock(&mutex2);}// printNumber(x) outputs "x", where x is an integer.voidzero(function<void(int)> printNumber){
for(int i =1; i <= n; i++){
pthread_mutex_lock(&mutex0);printNumber(0);if(i &1)pthread_mutex_unlock(&mutex1);elsepthread_mutex_unlock(&mutex2);}}voideven(function<void(int)> printNumber){
for(int i =2; i <= n; i+=2){
pthread_mutex_lock(&mutex2);printNumber(i);pthread_mutex_unlock(&mutex0);}}voidodd(function<void(int)> printNumber){
for(int i =1; i <= n; i+=2){
pthread_mutex_lock(&mutex1);printNumber(i);pthread_mutex_unlock(&mutex0);}}};