Syncronizing Threads
/* state > 0, multiple readers; state = 0, free */ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int state = 0; int rwlock(int rw) /* (read = 0, write = 1) */ { if (ret = pthread_mutex_lock(&mutex) { if (rw) { while (state) { if (ret = pthread_cond_wait(&cond, &mutex)) { (void)pthread_mutex_unlock(&mutex); return(ret); } } } else { state++; (void)pthread_mutex_unlock(&mutex); } } return(ret); } int rwunlock(int rw) /* (read = 0, write = 1) */ { if (!rw) { if (ret = pthread_mutex_lock(&mutex) { return(ret); } if (!--state) { ret = pthread_cond_broadcast(&cond); } } ret = pthread_mutex_unlock(&mutex); return(ret); }