pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t readerQ = PTHREAD_COND_INITIALIZER; pthread_cond_t writerQ = PTHREAD_COND_INITIALIZER; int readers = 0; int writers = 0; int active_writers = 0; reader( ) { pthread_mutex_lock(&m); while (!(writers == 0)) { pthread_cond_wait(&readersQ, &m); } readers++; pthread_mutex_unlock(&m); /* read */ pthread_mutex_lock(&m); if (--readers == 0) { pthread_cond_signal(&writersQ); } pthread_mutex_unlock(&m); } writer( ) { pthread_mutex_lock(&m); writers++; // number that want to write while(!((readers == 0) && (active_writers == 0))) { pthread_cond_wait(&writersQ, &m); } active_writers++; // number allowed to write pthread_mutex_unlock(&m); /* write */ pthread_mutex_lock(&m); active_writers--; if (--writers == 0) { pthread_cond_broadcast(&readerQ); } else { pthread_cond_signal(&writerQ); } pthread_mutex_unlock(&m); }