#ifndef _Semaphore_h_ #define _Semaphore_h_ #include class Semaphore{ public: Semaphore(int initial) { val = initial; pthread_mutex_init(&mutex, NULL); pthread_cond_init(&condition, NULL); } ~Semaphore(){ pthread_mutex_destroy(&mutex); pthread_cond_destroy(&condition); } void wait(){ pthread_mutex_lock(&mutex); while (val == 0) pthread_cond_wait(&condition, &mutex); --val; pthread_mutex_unlock(&mutex); } void signal(){ pthread_mutex_lock(&mutex); ++val; if (val == 1) pthread_cond_signal(&condition); pthread_mutex_unlock(&mutex); } protected: int val; pthread_mutex_t mutex; pthread_cond_t condition; }; #endif // _Semaphore_h_