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