/* * Readers-writers solution with condition variables. * Avoids starvation. * Brighten Godfrey * * Note: program is not a complete example -- we didn't actually start any threads. */ #include #include #include #include /* Global variables */ pthread_mutex_t m; pthread_cond_t turn; /* Event: someone else's turn */ int reading; int writing; int writers; void init(void) { pthread_mutex_init(&m, NULL); pthread_cond_init(&turn, NULL); reading = 0; writing = 0; writers = 0; } void reader(void) { pthread_mutex_lock(&m); if (writers) pthread_cond_wait(&turn, &m); while (writing) pthread_cond_wait(&turn, &m); reading++; pthread_mutex_unlock(&m); /* Reading would happen here */ pthread_mutex_lock(&m); reading--; pthread_cond_signal(&turn); pthread_mutex_unlock(&m); } void writer(void) { pthread_mutex_lock(&m); writers++; while (reading || writing) pthread_cond_wait(&turn, &m); writing++; pthread_mutex_unlock(&m); /* Writing would happen here */ pthread_mutex_lock(&m); writing--; writers--; pthread_cond_signal(&turn); pthread_mutex_unlock(&m); } int main(void) { init(); }