#include #include #include #include #define SIZE 16 int jobs[SIZE]; int in; int slots; pthread_mutex_t slots_mutex; pthread_cond_t slots_cond; int out; int items; pthread_mutex_t items_mutex; pthread_cond_t items_cond; void put(int job); void get(int* job); void* prod(void* data); void* cons(void* data); int main(int argc,char** argv) { pthread_t prodid,consid; in = 0; slots = SIZE; pthread_mutex_init(&slots_mutex,0); pthread_cond_init(&slots_cond,0); out = 0; items = 0; pthread_mutex_init(&items_mutex,0); pthread_cond_init(&items_cond,0); pthread_setconcurrency(3); pthread_create(&prodid,0,prod,0); pthread_create(&consid,0,cons,0); pthread_join(prodid,0); pthread_join(consid,0); return 0; } void* prod(void* data) { int i; for (i=0; i<1000; i++) { if (!(i%100)) printf("put %d\n",i); put(i); } put(-1); puts("prod done"); return 0; } void* cons(void* data) { int i; do { get(&i); if (!(i%100)) printf("got %d\n",i); } while (i>=0); puts("cons done"); return 0; } void put(int job) { pthread_mutex_lock(&slots_mutex); while (slots<=0) pthread_cond_wait(&slots_cond,&slots_mutex); jobs[in] = job; in++; in %= SIZE; slots--; items++; pthread_mutex_unlock(&slots_mutex); pthread_mutex_lock(&items_mutex); pthread_cond_signal(&items_cond); pthread_mutex_unlock(&items_mutex); } void get(int* job) { pthread_mutex_lock(&items_mutex); while (items<=0) pthread_cond_wait(&items_cond,&items_mutex); *job = jobs[out]; out++; out %= SIZE; items--; slots++; pthread_mutex_unlock(&items_mutex); pthread_mutex_lock(&slots_mutex); pthread_cond_signal(&slots_cond); pthread_mutex_unlock(&slots_mutex); }