ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多个生产者与消费者

2021-07-07 18:03:27  阅读:189  来源: 互联网

标签:消费者 多个 生产者 cond mutex MAXITEMS pthread ready shared


多个生产者与消费者

  生产者消费者问题属于有界缓冲区问题。我们现在讲述多个生产者向一个缓冲区中存入数据,多个生产者从缓冲区中取数据。共享缓冲区作为一个环绕缓冲区,存数据到头时再从头开始。我们使用一个互斥量保护生产者向缓冲区中存入数据。由于有多个生产者,因此需要记住现在向缓冲区中存入的位置。使用一个互斥量保护缓冲区中消息的数目,这个生产的数据数目作为生产者和消费者沟通的桥梁。使用一个条件变量用于唤醒消费者。由于有多个消费者,同样消费者也需要记住每次取的位置。

#include "unpipc.h"
#include "my_err.h"
#include <pthread.h>
#define MAXITEMS 6
#define MAXTHREADS 3

int buffer[MAXITEMS];

//生产者使用的结构体 struct shared { pthread_mutex_t mutex; int input;//下标 int i;//存入的值 }shared={PTHREAD_MUTEX_INITIALIZER};
//消费者使用的结构体,生产者也会使用 struct ready { pthread_mutex_t mutex; pthread_cond_t cond; int nready;//生产者为消费者准备好的可用的商品数量 int nget;//消费者从仓库中抓取商品的次数 }ready={PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER}; void *produce(void *arg) { while(1) { pthread_mutex_lock(&shared.mutex); if(shared.i>=MAXITEMS)//仓库满,不能再生产 { pthread_mutex_unlock(&shared.mutex); return NULL; } buffer[shared.input]=shared.i; if(++shared.input>=MAXITEMS)//1...MAXITEMS,循环缓冲,如果抓取的次数大于MAXITEMS,从头在开始计数 shared.input=0; //++shared.input; ++shared.i;//值 pthread_mutex_unlock(&shared.mutex); //使临界区尽量短使用多个互斥量,生产完毕可以消费了 pthread_mutex_lock(&ready.mutex); if(ready.nready==0)//如果有消费者等待消费,则唤醒 pthread_cond_signal(&ready.cond); ++ready.nready;//可以消费的商品的数目+1 pthread_mutex_unlock(&ready.mutex); } return NULL; } void *consume(void *arg) { while(1) { pthread_mutex_lock(&ready.mutex); if(ready.nready==0)//如果可以消费的数目==0,仓库中没有可消费的商品,等待 pthread_cond_wait(&ready.cond,&ready.mutex); if(++ready.nget>=MAXITEMS)//1...MAXITEMS { if(ready.nget==MAXITEMS)//抓取商品的次数==仓库的最大容量时少操作一次, printf("buffer[%d] = %d \n",ready.nget-1,buffer[(ready.nget-1)%MAXITEMS]); pthread_cond_signal(&ready.cond);// pthread_mutex_unlock(&ready.mutex); return NULL; } --ready.nready; pthread_mutex_unlock(&ready.mutex); printf("buffer[%d] = %d\n",ready.nget-1,buffer[(ready.nget-1)%MAXITEMS]); } return NULL; } int main() { pthread_setconcurrency(MAXTHREADS*2);// int i; pthread_t pid_produce[MAXTHREADS],pid_consume[MAXTHREADS]; for(i=0;i<MAXTHREADS;++i) pthread_create(&pid_produce[i],NULL,produce,NULL); for(i=0;i<MAXTHREADS;++i) pthread_create(&pid_consume[i],NULL,consume,NULL); for(i=0;i<MAXTHREADS;++i) pthread_join(pid_produce[i],NULL); for(i=0;i<MAXTHREADS;++i) pthread_join(pid_consume[i],NULL); exit(0); }

 

标签:消费者,多个,生产者,cond,mutex,MAXITEMS,pthread,ready,shared
来源: https://blog.51cto.com/u_12580130/3006320

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有