#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_ITEMS 10
pthread_cond_t cond_recv = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_send = PTHREAD_COND_INITIALIZER;
pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
bool full=false;
int count=0;
void *producer(void *thread_id)
{
while(true) {
pthread_mutex_lock(&cond_mutex);
while(full) {
pthread_cond_wait(&cond_recv, &cond_mutex) ;
}
pthread_mutex_unlock(&cond_mutex);
pthread_mutex_lock(&count_mutex);
++count;
full = true;
printf("producer(%li):%i\n", pthread_self() , count);
pthread_cond_broadcast(&cond_send);
pthread_mutex_unlock(&count_mutex);
if((count >= MAX_ITEMS) {
break;
}
}
}
|
void *consumer(void *thread_id)
{
while(true) {
pthread_mutex_lock(&cond_mutex);
while(!full) {
pthread_cond_wait(&cond_send , &cond_mutex) ;
}
pthread_mutex_unlock(&cond_mutex);
pthread_mutex_lock(&count_mutex);
--count;
full = false;
printf("consumer(%li):%i\n", pthread_self(), count);
pthread_cond_broadcast(&cond_recv);
pthread_mutex_unlock(&count_mutex);
if((count >= MAX_ITEMS) {
break;
}
}
}
|