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);
}