#include <stdio.h> #include <pthread.h> #include <assert.h> #define BSIZE 64 typedef struct { char buf[BSIZE]; int occupied; int nextin; int nextout; pthread_mutex_t mutex; pthread_cond_t more; pthread_cond_t less; }buffer_t; buffer_t buffer; void *producer(char item) { pthread_mutex_lock(&buffer.mutex); while(buffer.occupied>=BSIZE) pthread_cond_wait(&buffer.less,&buffer.mutex); assert(buffer.occupied<BSIZE); buffer.buf[buffer.nextin++] = item; buffer.nextin %= BSIZE; buffer.occupied++; printf("product item = %d/n",item); pthread_cond_signal(&buffer.more); pthread_mutex_unlock(&buffer.mutex); pthread_exit(0); } void *consumer() { char item; pthread_mutex_lock(&buffer.mutex); while(buffer.occupied<=0) pthread_cond_wait(&buffer.more,&buffer.mutex); assert(buffer.occupied>0); item = buffer.buf[buffer.nextout++]; buffer.nextout %= BSIZE; buffer.occupied--; pthread_cond_signal(&buffer.less); pthread_mutex_unlock(&buffer.mutex); printf("item = %d/n",item); pthread_exit(0); } int main() { int ret; pthread_t tid; pthread_t tid1,tid7,tid6,tid5,tid4; pthread_t tid10,tid11,tid12,tid13; ret = pthread_create(&tid,NULL,producer,8); if(ret) { printf("error:pthread_create/n"); exit(-1); } ret = pthread_create(&tid7,NULL,producer,7); if(ret) { printf("error:pthread_create/n"); exit(-1); } ret = pthread_create(&tid6,NULL,producer,6); if(ret) { printf("error:pthread_create/n"); exit(-1); } ret = pthread_create(&tid5,NULL,producer,5); if(ret) { printf("error:pthread_create/n"); exit(-1); } ret = pthread_create(&tid4,NULL,producer,4); if(ret) { printf("error:pthread_create/n"); exit(-1); } ret = pthread_create(&tid1,NULL,consumer,NULL); if(ret) { printf("error:pthread_create1/n"); exit(-1); } // ret = pthread_join(tid,NULL); if(ret) { printf("error:pthread_join/n"); exit(-1); } ret = pthread_join(tid1,NULL); if(ret) { printf("error:pthread_join1/n"); exit(-1); } ret = pthread_join(tid4,NULL); if(ret) { printf("error:pthread_join1/n"); exit(-1); } ret = pthread_join(tid5,NULL); if(ret) { printf("error:pthread_join1/n"); exit(-1); } ret = pthread_join(tid6,NULL); if(ret) { printf("error:pthread_join1/n"); exit(-1); } ret = pthread_join(tid7,NULL); if(ret) { printf("error:pthread_join1/n"); exit(-1); } ret = pthread_create(&tid10,NULL,consumer,NULL); if(ret) { printf("error:pthread_create1/n"); exit(-1); } ret = pthread_create(&tid11,NULL,consumer,NULL); if(ret) { printf("error:pthread_create1/n"); exit(-1); } ret = pthread_create(&tid12,NULL,consumer,NULL); if(ret) { printf("error:pthread_create1/n"); exit(-1); } ret = pthread_create(&tid13,NULL,consumer,NULL); if(ret) { printf("error:pthread_create1/n"); exit(-1); } return 1; }
linux线程,生产者消费者例子
最新推荐文章于 2024-04-05 19:19:06 发布