多进程-生产者,消费者问题

2023-05-16

进程同步经典问题-生产者消费者

生产者消费者模型描述:
生产者/消费者问题可以描述为:两个或者更多的进程(线程)共享同一个缓冲区,其中一个或多个进程(线程)作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个进程(线程)作为“消费者”从缓冲区中取走数据。生产者/消费者模型的关注点为:
1、生产者和消费者必须互斥的使用缓冲区
2.缓冲区空时,消费者不能读取数据
3.缓冲区满时,生产者不能添加数据
生产者消费者模型的优点:
1)解耦合性:因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码发生变化,都不会对对方产生影响。这样其实就是把生产者和消费者之间的强耦合解开,变成了生产者和缓冲区,消费者和缓冲区之间的弱耦合。
2)支持并发:如果消费者直接从生产者拿数据,则消费者需要等待生产者生产数据,同样生产者需要等待消费者消费数据。而有了生产者/消费者模型,生产者和消费者可以是两个独立的并发主体。生产者把制造出来的数据添加到缓冲区,就可以以再去生产下一个数据了。而消费者也是一样的,从缓冲区中读取数据,不需要等待生产者。这样,生产者和消费者就可以并发的执行。
3)支持闲忙不均:如果消费者直接从生产者这里拿数据,而生产者生产数据很慢,消费者消费数据很快,或者生产者生产数据多,消费者消费数据很慢。都会造成占用CPU的时间片白白浪费。生产者/消费者模型中,生产者只需要将生产的数据添加到缓冲区,缓冲区满了就不生产了。消费者从缓冲区中读取数据,缓冲区空了就不消费了,使得生产者/消费者的处理能力达到一个动态平衡。
重点:
1)假设缓冲区的大小为n(也就是存储单元的个数),它就可以被生产者和消费者循环使用。
2)分别设置两个指针in和out,指向生产者将存放数据的存储单元和消费者将取数据的单元
在这里插入图片描述
3)生产者不能向满缓冲区写数据,消费者不能再空缓冲区中取数据,即必须对生产者和消费者进行同步。另外,如果不进行同步控制,生产者和消费者可能同时进入缓冲区,甚至可能同时读写一个存储单元,将导致执行结果不确定。
生产者执行流程:
在这里插入图片描述消费者执行流程:
在这里插入图片描述
使用信号量同步的过程如下: 在这里插入图片描述
具体问题场景描述:
假设有一个int型数组 ,有n=10 个元素。现在视该数组为缓冲区,创建三个线程作为生产者,随机几秒向缓冲区写入数据,再创建两个线程作为消费者,每隔几秒从缓冲区取数据并打印。 这个过程一直循环。 (随机函数可使用m = rand(), 每操作一次缓存区,适当可以等待若干秒,如使用sleep(),以便以观察结果,不使用也可以。)

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<pthread.h>//进程的头文件
    #include<semaphore.h>//信号量的头文件
    #include<sys/sem.h>
  
    sem_t s;//互斥信号量,控制对缓冲区的访问
    sem_t n;//计数信号量,缓冲区数据个数
    sem_t e;//计数信号量,缓冲区空余单元个数
  
    int buffsize[10]={0};
    int in=0;//存放数据的指针
    int out=0;//取数据的指针
  
    void* producers()
    {
      while(1)
      {
        srand(time(NULL));;
        int data=rand()%100;
        sem_wait(&e);;
        sem_wait(&s);
        buffsize[in]=data;
        printf("%d""%d",in,data);
        printf("\n");
        in=(in+1)%10;
        sem_post(&s);
        sem_post(&n);
        sleep(1);
      }
    }
 
    void* consumers()
    {
    while(1)
      {
        sem_wait(&n);
        sem_wait(&s);
        printf("%d""%d",out,buffsize[out]);
        printf("\n");
        buffsize[out]=0;
        out=(out+1)%10;
        sem_post(&e);
        sem_post(&s);
        sleep(1);
   }
    }
 
 int main()
    {
       pthread_t   p1,p2,p3,c1,c2;
       sem_init(&s,0,1);
       sem_init(&s,0,0);
       sem_init(&s,0,10);
       pthread_create(&p1,NULL,producers,NULL);
       pthread_create(&p2,NULL,producers,NULL);
       pthread_create(&p3,NULL,producers,NULL);
       pthread_create(&c1,NULL,consumers,NULL);
       pthread_create(&c2,NULL,consumers,NULL);
       pthread_join(p1,NULL);
       pthread_join(p2,NULL);
       pthread_join(p3,NULL);
       pthread_join(c1,NULL);
       pthread_join(c2,NULL);
       sem_destroy(&s);
       sem_destroy(&n);
       sem_destroy(&e);
       exit(0);
}
                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多进程-生产者,消费者问题 的相关文章

  • 查看数据库当前编码【Mariadb、Mysql、Flask】

    情景 在centos下部署flask项目 xff0c 使用的是mariadb xff0c xff08 本地mysql香香的 xff09 xff0c 用到sqlarchemy xff0c 插入前中文 xff0c 出入后查询乱码 xff0c 最
  • JVM之调优篇

    内存泄漏与内存溢出 内存溢出 指在程序申请内存时 xff0c 没有足够的内存可以分配 xff0c 就是OOM xff0c 即使垃圾回收之后也不能有足够的空间分配 内存泄漏 Memory Leak 是指在程序运行后 xff0c 没有释放所占用
  • 使用document解析xml文件

    在慕课上课时 xff0c 看到可以使用document来解析xml文件 xff0c 把上课的代码放出来 xff0c 先记录一下 大概步骤如下 xff1a 1 使用DocumentBuilderFactory 创建对象后再创建Document
  • 【STM32】HAL库开发教程(四)—串口FIFO使用

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 本文主要介绍STM32 HAL库开发中串口 FIFO的使用 一 开发步骤 1 Cubemx配置 在左侧引脚配置栏选择目标串口号在串口模式处配置串口模
  • mysql报错ORDER BY clause is not in SELECT list, references column ‘‘which is not in SELECT list解决方案

    mysql报错Expression 1 of ORDER BY clause is not in SELECT list references column 39 fusion m create time 39 which is not i
  • 文件管理

    彩蛋 操作系统总目录 戳我 文章目录 1 初始文件管理2 文件的逻辑结构无结构文件有结构文件顺序文件是否可以实现记录的随机存取变长记录定长记录 索引文件索引顺序文件多级索引顺序文件 3 文件目录文件控制块需要对目录进行哪些操作 目录结构单级
  • 设备管理

    彩蛋 操作系统总目录 戳我 文章目录 I O设备的基本概念与分类什么是I 0设备 I O设备分类按使用特性分类按照传输速度分类按照信息交换的单位分类 I O控制器I 0设备的机械部件I 0设备的电子部件 I 0控制器 I O控制器的组成内存
  • 进程管理

    彩蛋 操作系统总目录 戳我 进程 进程的概念 进程的定义 程序 就是一个指令序列 程序段 数据段 PCB三部分组成了进程实体 进程映像 一般情况下 xff0c 我们把进程实体就简称为进程 例如 xff0c 所谓创建进程 xff0c 实质上是
  • 哲学家进餐问题

    文章目录 哲学家进餐问题问题描述问题分析思想三代码小结 哲学家进餐问题 问题描述 一张圆桌上坐着5名哲学家 xff0c 每两个哲学家之间的桌上摆一根筷子 xff0c 桌子的中间是一碗米饭 哲学家们倾注毕生的精力用于思考和进餐 xff0c 哲
  • 进程同步和互斥

    彩蛋 操作系统总目录 戳我 文章目录 进程互斥的硬件实现方法中断屏蔽方法TestAndSet指令Swap指令小结 信号量机制信号量机制 整型信号量信号量机制 记录型信号量小结 用信号量机制实现信号量机制实现进程互斥信号量机制实现进程同步信号
  • Java Future

    Callable Doug Lea 大师 xff0c 在1 5的杰作 span class token comment 64 see Executor 64 since 1 5 64 author Doug Lea 64 param lt
  • 布隆过滤器

    网页黑名单 垃圾邮件过滤系统 爬虫网站判重 哈希函数 特征 xff1a 典型的哈希函数都有无限的输入值域 当给哈希函数传入相同的输入值时 xff0c 返回值一样 当给哈希函数传入不同的输入值时 xff0c 返回值可能一样 xff0c 也可能
  • mysql45讲知识框架图

    1 一条SQL查询语句是如何执行的 xff1f 在有些场景下 xff0c 执行器调用一次 xff0c 在引擎内部则扫描了多行 xff0c 因此引擎扫描行数跟rows examined并不是完全相同的 主要讲述mysql 服务器和存储引擎之间
  • session 和 cookie

    一 区别 存储位置不同 xff1a session 存储在服务器端 xff1b cookie 存储在浏览器端 安全性不同 xff1a cookie 安全性一般 xff0c 在浏览器存储 xff0c 可以被伪造和修改 容量和个数限制 xff1
  • R语言中的igraph包绘制网络图

    本文转自网络 R语言中的igraph包可以很方便地画出网络图 xff0c 在社交关系分析等领域发挥重要作用 xff0c 下面介绍包中一个重要的函数graph from data frame xff08 xff09 graph from da
  • OnNewIntent四种启动模式下的调用时机

    Activity启动模式 Intent Flags taskAffinity task和back stack总结 1 singleInstance模式 第一次进入 xff1a onCreate onStart 在栈顶再次进入 xff1a o
  • windows10 Ubuntu 双系统安装及美化详细步骤

    Windows 10 Ubuntu 双系统安装踩坑实录 写在前面背景介绍 硬件介绍安装 Ubuntu下载镜像文件 制作启动盘安装步骤 安装必备软件混凝土长方形实体逾越工具安装 Nvidia 显卡驱动远程连接工具即时通讯中文输入法 美化 Ub
  • 如何优雅地停止java程序

    方法一 span class token class name System span span class token punctuation span span class token function exit span span c
  • 删除数组里面的某一个值

    Array prototype remove span class token operator 61 span function span class token punctuation span val span class token
  • ASP.NET中实现点击不同菜单项,在当前页面显示其对应内容

    疑惑 xff1a 用ASP NET开发项目时 xff0c 若想要实现这样的界面 xff1a 顶部是导航栏 xff0c 有多个菜单项 xff0c 点击不同的菜单项后 xff0c 下方显示对应的内容页面 xff1b 或者是左侧是菜单栏 xff0

随机推荐

  • 解决error ‘XXX‘ is not defined no-undef且项目没有eslintrc.js文件问题

    问题描述 这是因为eslint的语法校验导致的问题 xff0c 文件是通过public的index html中 lt script src 61 34 xxxxxx js 34 gt lt script gt 引入的 xff0c 没有定义全
  • CentOS7 下MariaDB安装与简单配置(最新)

    前言 MySQL和MariaDB的区别 xff1a LAMP架构盛极一时 xff0c 这离不开MySQL的免费与易用 xff0c 但是在Oracle收购了Sun之后 xff0c 很多公司开始担忧MySQL的开源前景 xff0c 而最近Ora
  • JAVA基础知识(一)

    目录 1 java的数据类型类型之间的转换 xff08 自动转型 强制转型 特殊点 xff09 2 运算符2 1算术运算符2 2逻辑运算符2 3关系运算符2 4赋值运算符2 5三目运算符2 6位运算符 3 运算符的优先级4 表达式5 转义字
  • JAVA基础知识(二)

    目录 1 循环遍历2 排序算法2 1 冒泡排序2 2 选择排序2 3插入排序 3 数组的查找3 1顺序查找3 2二分查找 xff08 折半查找 xff09 4 Arrays工具类5 可变参数 1 循环遍历 JAVA中的常用的循环遍历有for
  • JAVA基础知识(三)

    目录 1 JAVA关键字1 1关键字 xff1a private1 2关键字 xff1a this1 3关键字 xff1a static1 4关键字 xff1a super1 5关键字 xff1a final 2 继承继承中的构造方法 3
  • JAVA基础知识(四)

    目录 1 抽象类 抽象方法2 接口interface3 多态4 对象转型5 内存分析6 设计原则7 单例设计模式 1 抽象类 抽象方法 1 抽象方法和抽象类必须使用abstract修饰符修饰 xff0c 有抽象方法的类只能被定义成抽象类 x
  • 基于mybatis-plus的代码自动生成工具(自定义模板)

    MyBatis Plus是一个MyBatis框架的增强工具 xff0c 在MyBatis的基础上只做增强不做改变 xff0c 为简化开发 提高效率而生 对于mybatis plus不了解的同学 xff0c 可以去MyBatis Plus官网
  • capabilities: ambient capabilities说明

    linux capability介绍 最早之前 xff0c linux对任务权限分为privileged processes xff08 UID等于0 xff0c 属于超级用户或者root用户 xff09 和unprivileged pro
  • 生死簿后台管理系统(有趣、放松下大脑)

    第一幕 xff1a 缘起 听说阎王爷要做个生死簿后台管理系统 xff0c 我们派去了一个程序员 996程序员做的梦 xff1a 第一场 xff1a 团队招募 为了应对地府管理危机 xff0c 阎王打算找 人 开发一套地府后台管理系统 xff
  • 年度最受欢迎的Python的书籍,还不来看看!

    Python是一种通用的解释型编程 xff0c 主要用于Web开发 机器学习和复杂数据分析 Python对初学者来说是一种完美的语言 xff0c 因为它易于学习和理解 xff0c 随着这种语言的普及 xff0c Python程序员的机会也越
  • 线程安全的实现方法

    1 互斥同步 互斥同步是一种常见也是最主要的并发正确性保障手段 xff0c 同步是指在多个线程并发访问共享数据时 xff0c 保证共享数据在同一个时刻只被线程使用 互斥实现方式有互斥量 xff0c 临界区 xff0c 信号量等手段 JAVA
  • CATIA卸载不完全,导致右击新建中有残留——注册表处理方法

    我通过计算机自带的 卸载程序 xff0c 卸载CATIA时 xff0c 出现 找不到指定文件 的情况 xff0c 又不想下载相关第三方软件 xff0c 遂尝试本地删除 首先删除安装目录下的文件 其次删除以下目录中的 Dassault Sys
  • BlackArch Linux安装VMware Tools教程

    BlackArch Linux安装VMware Tools教程 其实 xff0c 只要是Linux系统 xff0c 安装VMware Tools都是大同小异 xff0c 我曾经也给大家分享过一篇文章 xff1a VMware虚拟机 Linu
  • 二叉树的创建(C语言)

    树的基本性质和概念 1 p 61 q 43 1 其中p为顶点 xff0c q为边 2 结点的度 xff1a 子树的个数 xff0c 树的度 xff1a 结点度的最大值 3 连通且无圈 由于所有的树都可以转化为二叉树 xff0c 下列出二叉树
  • colmap多相机重建多场景及数据库数据快速修改方法

    1 colmap流程 1 1 新建项目 首先打开colmap xff0c 然后创建新的project xff0c 其中数据库目录和名称自己选定 xff0c 注意不要将它放到图像目录下即可 然后images选择的是图像目录 xff08 比如我
  • 安装EXSi服务器

    安装EXSi服务器 一 创建VMware EXSi5 1服务器 1 在VMware服务器中创建新的虚拟机 xff0c 选择自定义配置 2 硬件兼容性选择Workstation11 0版本 xff08 最高版本 xff09 3 选择 稍后安装
  • 2020 关于mybatis的resultMap=“BaseResultMap“说明

    关于mybatis的resultMap 61 34 BaseResultMap 34 说明 mybatis 非常的智能 xff0c 如果配置了resultMap xff0c 返回值统一使用 resultMap 61 BaseResultMa
  • 高斯数库安装笔记

    手机用鸿蒙 服务用欧拉 欧拉里有高斯数据库 欧拉 openEuler 22 03 LTS x86 64 dvd iso 里预装gauss数据库 语言选 english 在安装系统的时候在 一个界面把软件 gt 服务 gt opengauss
  • bclinux使用yum卡主解决方法、bclinux用rpm安装本地源方法、Failed to set locale, defaulting to C.UTF-8解决方法、bclinux镜像下载地址

    文章目录 环境说明bclinux使用yum卡主解决方法说明解决方法方法1方法2 bclinux用rpm安装离线源下载http包安装http包测试 Failed to set locale defaulting to C UTF 8说明解决方
  • 多进程-生产者,消费者问题

    进程同步经典问题 生产者消费者 生产者消费者模型描述 xff1a 生产者 消费者问题可以描述为 xff1a 两个或者更多的进程 xff08 线程 xff09 共享同一个缓冲区 xff0c 其中一个或多个进程 xff08 线程 xff09 作