Syncronizing Threads


Multi-reader, Single-writer Lock


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


[TOP] [BACK] [FORWARD]


Prepared by Chris Provenzano (proven@mit.edu)