多生产者单消费者捆绑消费问题

2023-05-16

1. 问题描述

某商店有两种食品A和B,最大数量各为m个。该商店将A,B两种食品搭配出售,每次各取一个。为避免食品变质,遵循先到食品先出售的原则,有两个食品公司分别不断地供应AB两种食品(每次一个)。为保证正常销售,当某种食品的数量比另种的数量超过k(k<m)个时,暂停对数量大的食品进货,补充数量少的食品,请回答:

(1) 共需设置几个进程?
(2) 试用P,V操作解决上述问题中的同步和互斥关系

2. 问题分析

首先,我们对问题进行抽象:可以看作是多生产者,单消费者问题。两个生产者A,B产生两类商品,供消费者进程消费,可以用3个进程表示。下面我们对问题中的互斥和同步关系进行抽象:

互斥关系

  • 两个生产商对商店商品的供应应该是互斥的,即:两个厂商不能同时访问(添加)商品队列
  • 为保证安全,生产商与消费者也不能同时访问商品队列

同步关系

  • 只有当商品队列未满时,生产者才可供货
  • 只有当商品队列同时存在A,B两种商品时,消费者才可以销售
  • 由于当某种食品的数量比另种的数量超过k(k<m)个时,要暂停对数量大的食品进货,所以此条件的判断应在生产之前。同时,由于商品数量的差值这一变量是“动态的”,且需要互斥访问,故设置信号量动态表示比较方便

注意:由于题目中存在捆绑销售的关系,即:购买一个A商品,一定要同时购买一个B商品

程序关系图

由上述同步关系可知,程序关系图如下:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3. 问题解决

变量说明

  • store信号量用于表示商店货架的空位,初始值为m
  • mutex信号量用于控制商店队列的互斥访问,初值为1
  • a_number信号量用于表示商店队列中A商品的数目
  • b_number信号量用于表示商店队列中B商品的数目
  • a_buffer信号量用于表示A商品还可以生产的数量,初值为k
  • b_buffer信号量用于表示B商品还可以生产的数量,初值为k

伪代码实现

semaphore store=m,mutex=1,a_b=0,b_a=0;
void ProducerA():
{
	do{
        // produce product A
        
        wait(store);
        wait(a_buffer);
        wait(mutex);
       
        // add product A to the shop list
        
        signal(mutex);
        signal(b_buffer);
        signal(a_number);
            
    }while(ture);
}

void ProducerB():
{
	do{
        // produce product B
        
        wait(store);
        wait(b_buffer);
        wait(mutex);
       
        // add product B to the shop list
        
        signal(mutex);
        signal(a_buffer);
        signal(b_number);
            
    }while(ture);
}

void Consumer():
{
	do{
        
        wait(a_number);
        wait(b_number);
        wait(mutex);
       
        // remove product A and B from the shop list
        
        signal(mutex);
        signal(store);
        
        // use product A and B
            
    }while(ture);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多生产者单消费者捆绑消费问题 的相关文章

  • MapStruct简介简单应用

    1 MapStruct 是什么 xff1f 1 1 JavaBean 的困扰 对于代码中 code JavaBean code 之间的转换 xff0c 一直是困扰我很久的事情 在开发的时候我看到业务代码之间有很多的 code JavaBea
  • SpringBoot入门案例

    基础项目该包含哪些东西 Swagger在线接口文档 CodeGenerator 代码生成器 统一返回 通用的分页对象 常用工具类 全局异常拦截 错误枚举 自定义异常 多环境配置文件 Maven多环境配置 日志配置 JenkinsFile S
  • Spring事务管理机制

    一 Spring事务管理的几种方式 xff1a Spring事务在具体使用方式上可分为两大类 xff1a 1 声明式 基于 TransactionProxyFactoryBean的声明式事务管理 基于 lt tx gt 和 lt aop g
  • SpringBoot 注解大全

    一 注解 annotations 列表 1 64 SpringBootApplication 包含了 64 ComponentScan 64 Configuration和 64 EnableAutoConfiguration注解 其中 64
  • Spring 中的bean 是否线程安全

    结论 xff1a 不是线程安全的 Spring容器中的Bean是否线程安全 xff0c 容器本身并没有提供Bean的线程安全策略 xff0c 因此可以说Spring容器中的Bean本身不具备线程安全的特性 xff0c 但是具体还是要结合具体
  • SpringBoot使用PageHelper分页

    一 开发准备 1 开发工具 IntelliJ IDEA 2020 2 3 2 开发环境 Red Hat Open JDK 8u256 Apache Maven 3 6 3 3 开发依赖 SpringBoot lt dependency gt
  • Windows Server 出现多个匿名登陆用户的问题解决

    1 起因 工作中需要在同一台 windows server的机器上多个用户同时使用 xff0c 遂建立多个账号 xff0c 供大家进行使用 2 问题 一段时间后发现系统特别卡顿并会死机 xff0c 查询原因后发现 xff0c 如图所示 xf
  • java锁 synchronized的使用及原理剖析

    synchronized用法有三个 修饰实例方法 修饰静态方法 修饰代码块 1 修饰实例方法 synchronized关键词作用在方法的前面 xff0c 用来锁定方法 xff0c 其实默认锁定的是this对象 public class Th
  • 面试HashMap的原理

    一般来说 xff0c java面试必不可少的菜品 xff0c 那就是 来 xff0c 讲一下HashMap的原理 那么今天就来讲一下HashMap的原理 先说一下JDK1 7跟JDK1 8对它的改变 JDK1 7之前使用的是数组加链表 xf
  • JAVA开发环境配置

    1 自己在网上下载JDK xff0c 本教程使用JDK1 6 下载好JDK后双击运行 xff0c 然后根据提示进行安装 安装好JDK后 bin xff1a 存放java可执行文件 如 xff1a javac exe java exe等等 d
  • MyEcplise_Maven搭建SSM框架

    Maven源码 链接 xff1a https pan baidu com s 1eTQMJQy 密码 xff1a 8j1q 博文中的MyEcplise 链接 xff1a https pan baidu com s 1dEdQYa 密码 xf
  • 怎么使用Linux常用命令大全

    系统信息 arch 显示机器的处理器架构 1 uname m 显示机器的处理器架构 2 uname r 显示正在使用的内核版本 dmidecode q 显示硬件系统部件 SMBIOS DMI hdparm i dev hda 罗列一个磁盘的
  • MySQL常用语句详解

    Winfrom连接网页 第一种方法 xff1a 调用本地浏览器System Diagnostics Process Start 34 https www microsoft com zh cn 34 第二种方法 xff1a 连接 strin
  • Maven搭建SSH连接Oracle数据库

    Maven工程搭建SSH连接Oracle数据库 首先在pom xml里引入jar lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmlns xsi 61 34 http
  • MyBatis简介与运用

    1 Mybatis简介 1 1 Mybatis是什么 Mybatis是一个java的持久层框架 xff0c 保存到数据库 持久化 xff1a 保存到本地文件 1 2 Mybatis的作用 操作数据库 1 3 为什么要学习mybatis 1
  • SpringMVC入门原理

    1 Springmvc原理 1 1 什么是springmvc SpringMVC是一个Spring框架内置的对MVC模式的实现 xff0c 就spring的一个子模块 1 2 什么是mvc Model view controller 模型
  • MyBatis逆向工程建立实体

    下面是用MyEcplise开发工具 为例 使用Ecplise操作步骤雷同于MyEcplise 1 第一步 2 搜索MyBatis 等待装载完成 xff0c 完成后 3 创建一个web项目 创建包 xff0c 创建generatorConfi
  • python apscheculer 报错 skipped: maximum number of running instances reached (1)

    apscheduler定时任务报错skipped maximum number of running instances reached 1 原因是默认max instances最大定时任务是1个 xff0c 可以通过在add job中调m
  • java 反射很重要

    1 创建一个User类 public class User private String username private String password private String name public User public Use
  • Netty入门案例教程

    1 首先导入netty all 5 0 0 Alpha1 jar 2 创建一个NettyConfig 整个工程的全局配置 package websocketcom netty import io netty channel group Ch

随机推荐