#include #include #define STACKSIZE 20 struct stack { int count; int val[STACKSIZE]; }; pthread_mutex_t mut; pthread_mutex_t output; void print(int v) { pthread_mutex_lock(&output); printf("Thread %u says: %d\n",pthread_self(),v); fflush(stdout); pthread_mutex_unlock(&output); } void prints(char* s) { pthread_mutex_lock(&output); printf("Thread %u says: %s\n",pthread_self(),s); fflush(stdout); pthread_mutex_unlock(&output); } int full(struct stack* ss) { return (ss->count==STACKSIZE); } int empty(struct stack* ss) { return (ss->count==0); } /* Doesn't check full(). It really should */ void add(struct stack* ss, int v) { pthread_mutex_lock(&mut); ss->val[ss->count]=v; prints("Adds"); (ss->count)++; pthread_mutex_unlock(&mut); } /* Doesn't check empty(). It really should */ int del(struct stack* ss) { int res; pthread_mutex_lock(&mut); (ss->count)--; res=ss->val[ss->count]; /* printf("Read %d got %d\n",ss->count, res); */ pthread_mutex_unlock(&mut); return res; } void* adder(void* in) { int v=0; int j=0; struct stack* ss=(struct stack*)in; while (1) { if (!full(ss)) { add(ss,v++); } pthread_yield(); } return 0; } void* reader(void* in) { struct stack* ss=(struct stack*)in; int j; prints("Looping"); while(1) { if (!empty(ss)) { j=del(ss); print(j); } pthread_yield(); } } int main(int argc, char** argv) { pthread_t tid,r1,r2; struct stack ss; ss.count=0; pthread_mutex_init(&mut,0); pthread_mutex_init(&output,0); pthread_create(&tid, 0, adder, &ss); pthread_create(&r1,0,reader,&ss); pthread_create(&r2,0,reader,&ss); printf("adder=%d reader=%d reader=%d\n",tid,r1,r2); pthread_exit(0); /* we want the threads to keep going */ return 0; }