Syncronizing Threads
/* It is the data that is shared so you only need one mutex. */
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_w = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_r = PTHREAD_COND_INITIALIZER;
int buf_count = 0, buf_r_loc = 0, buf_w_loc = 0;
char buf[1024];
#define INC(x) (++x == 1024) ? (x) = 0 : (x)
char read_buf(void)
{
char ret;
pthread_mutex_lock(&mutex);
while (buf_count == 0) {
pthread_cond_broadcast(&cond_w);
pthread_cond_wait(&cond_r, &mutex);
}
buf_count--;
ret = buf[buf_r_loc];
INC(buf_r_loc);
pthread_cond_broadcast(&cond_w);
pthread_mutex_unlock(&mutex);
return(ret);
}
void write_buf(char ch)
{
pthread_mutex_lock(&mutex);
while (buf_count == 1024) {
pthread_cond_broadcast(&cond_r);
pthread_cond_wait(&cond_w, &mutex);
}
buf_count++;
buf[buf_w_loc] = ch;
INC(buf_w_loc);
pthread_cond_broadcast(&cond_r);
pthread_mutex_unlock(&mutex);
}