previous | start | next

Ensuring Writers get to write

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


previous | start | next