生产者消费者模型描述

生产者/消费者问题可以描述为:两个或者更多的进程(线程)共享同一个缓冲区,其中一个或多个进程(线程)作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个进程(线程)作为“消费者”从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:n 生产者和消费者必须互斥的使用缓冲区n 缓冲区空时,消费者不能读取数据n 缓冲区满时,生产者不能添加数据

生产者/消费者模型的优点在于:

1) 解耦:因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码发生变化,都不会对对方产生影响。这样其实就是把生产者和消费者之间的强耦合解开,变成了生产者和缓冲区,消费者和缓冲区之间的弱耦合。

2) 支持并发:如果消费者直接从生产者拿数据,则消费者需要等待生产者生产数据,同样生产者需要等待消费者消费数据。而有了生产者/消费者模型,生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据添加到缓冲区,就可以再去生产下一个数据了。而消费者也是一样的,从缓冲区中读取数据,不需要等待生产者。这样,生产者和消费者就可以并发的执行。

3)=支持忙闲不均:如果消费者直接从生产者这里拿数据,而生产者生产数据很慢,消费者消费数据很快,或者生产者生产数据很多,消费者消费数据很慢。都会造成占用CPU的时间片白白浪费。生产者/消费者模型中,生产者只需要将生产的数据添加到缓冲区,缓冲区满了就不生产了。消费者从缓冲区中读取数据,缓冲区空了就不消费了,使得生产者/消费者的处理能力达到一个动态的平衡。

生产者流程

消费者流程

使用信号量同步的过程如下:

具体问题场景描述

假设有一个int型数组 ,有n=10 个元素。现在视该数组为缓冲区,创建三个线程作为生产者,随机几秒向缓冲区写入数据,再创建两个线程作为消费者,每隔几秒从缓冲区取数据并打印。 这个过程一直循环。 (随机函数可使用m = rand(), 每操作一次缓存区,适当可以等待若干秒,如使用sleep(),以便以观察结果,不使用也可以。)请编写代码实现。


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>#define M 10 // 缓冲区数目即数组长度
nt in = 0;
int out = 0;
int buff[M] = {0};
//三个信号量
sem_t sem1; // 同步信号量
sem_t sem2;   // 同步信号
pthread_mutex_t mutex; // 互斥信号量int ProductId = 0;   //生产者id
int ProchaseId = 0; //消费者id/* 生产者方法 */
void *product()
{int id = ++ProductId;int number; while(1){sleep(1);sem_wait(&sem1);pthread_mutex_lock(&mutex);number=rand()%10;buff[in]=number; printf("生产者%d生产了%d\n",id,buff[in]);in = in % M;++in;pthread_mutex_unlock(&mutex);sem_post(&sem2);}
}/* 消费者方法 */
void *prochase()
{int id = ++ProchaseId;while(1){sleep(2);sem_wait(&sem2);pthread_mutex_lock(&mutex);    printf("消费者%d消费了%d\n",id,buff[out]);out = out % M;++out;    pthread_mutex_unlock(&mutex);sem_post(&sem1);}
}int main()
{pthread_t id1[3];pthread_t id2[2];int i;// 初始化信号量sem_init(&sem1, 0, M);sem_init(&sem2, 0, 0);pthread_mutex_init(&mutex, NULL);// 创建3个生产者线程for(i = 0; i < 3; i++){pthread_create(&id1[i], NULL, product, (void *)(&i));}//创建2个消费者线程for(i = 0; i < 2; i++){pthread_create(&id2[i], NULL, prochase, NULL);}//销毁线程for( i=0;i<3;i++){pthread_join(id1[i],NULL);}for( i=0;i<2;i++){pthread_join(id2[i],NULL);}exit(0);
}

操作系统之生产者与消费者相关推荐

  1. (二十三)操作系统-多生产者·多消费者问题

    文章目录 一.问题描述 二.问题分析 1. 关系分析 2. 整理思路 三.实现 1. 代码 2.如果不要互斥信号量 3. 将盘子(缓冲区)容量设为2 四.总结 一.问题描述   桌子上有一只盘子,每次 ...

  2. 操作系统:生产者与消费者问题

    使用信号量实现生产者-消费者问题 问题描述:使用一个缓冲区来保存物品,只有缓冲区没有满,生产者才可以放入物品:只有缓冲区不为空,消费者才可以拿走物品. 因为缓冲区属于临界资源,因此需要使用一个互斥量 ...

  3. Linux相关——linux操作系统之生产者与消费者同步问题

    #include<stdio.h> #include<linux/sem.h> #include<linux/shm.h> #include<unistd.h ...

  4. 操作系统—多生产者多消费者问题

    建议将思维导图保存下来观看,或者点击这里在线观看

  5. 生产者和消费者代码———操作系统_操作系统基础15-生产者消费者问题

    在上一篇操作系统基础14提到通过信号量解决生产者消费者问题.本篇来详细说说操作系统中的经典问题-生成者消费者问题 生产者消费者问题 (Producer-consumer problem) 该问题是一个 ...

  6. Linux并发程序课程设计报告,网络操作系统课程设计--进程机制与并发程序设计-linux下生产者与消费者的问题实现.doc...

    网 络 操 作 系 统 课 程 设 计 网络操作系统课程设计 设计内容:进程机制与并发程序设计inux下生产者与消费者的问题实现进程机制与并发程序设计inux下生产者与消费者的问题实现 (1)掌握基本 ...

  7. 操作系统实验 生产者消费者问题详解

    操作系统课程设计 生产者消费者实验报告 一.实验目的 加深对进程概念的理解,明确进程与程序的区别. 认识并发执行的本质. 理解和掌握Linux和Windows进程通信系统调用的功能,通过实验和学习,提 ...

  8. 操作系统实验之生产者和消费者程序

    这是我的操作系统实验课的实验之一,实验要求"实现生产者和消费者程序". 老师给了我们示例程序,要求我们自己修改调试.程序代码如下,已经在本地linux系统上能够正确运行. p是模拟 ...

  9. 【操作系统】生产者消费者问题

    生产者消费者模型 文章目录 生产者消费者模型 @[toc] 一. 生产者消费者问题 二. 问题分析 三. 伪代码实现 四.代码实现(C++) 五. 互斥锁与条件变量的使用比较 一. 生产者消费者问题 ...

最新文章

  1. [THUWC2017]在美妙的数学王国中畅游
  2. Chrome 技术篇-console控制台检测xpath、css唯一性
  3. 智能合约重构社会契约(7)以太坊总结
  4. cors 前后端分离跨域问题_SpringBoot 实现前后端分离的跨域访问(CORS)
  5. vertical-align和line-height的深入应用
  6. Exchange 2016 之分层通讯簿
  7. GitHub高赞,一款足以取代迅雷的开源下载工具
  8. 重新训练大脑!这些APP可治愈心理疾病
  9. python编程控制安捷伦电源_安捷伦怎么设置电流电压输出 Agilent/HP 6674A DC电源 程控电源租赁 仪器仪表租赁 硬件测试服务...
  10. linux pdf中文乱码,英文乱码(乱码为方格之类的解决方法)
  11. 左偏树(XJT Love Trees,玲珑杯 Round#8 C lonlife 1081)
  12. XL4001 典型应用电路
  13. layui.css如何使用,Layui新手教程
  14. 化繁为简,我用”知晓推送”开发微信小程序订阅消息
  15. HTTP断点续传以及缓存问题
  16. 给定一个完全循环赛的比赛结果,其中n个队伍两两比赛一次。每场比赛以一方胜出或者平局结束。设计一个算法,把n个队伍排序,序列中每个队伍都不曾输给紧随其后的那个队伍。说明该算法的时间效率类型。
  17. matlab数字图像处理课程设计报告,数字图像处理初步-实验1
  18. 互联网晚报 | 9月16日 星期四 | 网易云音乐发布“村民证”;阿里社区电商品牌升级为“淘菜菜”;高德打车上线“实景上车点”
  19. layui表格自定义分页
  20. redis命令---redist键命令(key)---redis字符串命令(str)

热门文章

  1. IoT物联网设备数据安全解决方案
  2. matlab显示sig,Matlab中LSSVM参数gam和sig2寻优范围如何确定以及寻优具体程序如何实现的问题...
  3. qml 分隔工具栏ToolSeparator 工具提示ToolTip 旋转轮Tumbler
  4. 防百度云加速html,百度云加速3.0轻松应对全球最大DDoS攻击
  5. kuangbin专题八 HDU4081 Qin Shi Huang's National Road System(次小生成树)
  6. 10道前端面试题(带答案)
  7. mx6 CSR8670驱动移植 基于linux3.14.58
  8. 视频服务器(8) Kurento[3] unity客户端
  9. mac搭建python开发环境_Mac打造python2 python3开发环境
  10. C++ 性能优化篇一《优化概述》