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 Await(store);wait(a_buffer);wait(mutex);// add product A to the shop listsignal(mutex);signal(b_buffer);signal(a_number);}while(ture);
}void ProducerB():
{do{// produce product Bwait(store);wait(b_buffer);wait(mutex);// add product B to the shop listsignal(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 listsignal(mutex);signal(store);// use product A and B}while(ture);
}

多生产者单消费者捆绑消费问题相关推荐

  1. 并发无锁队列学习(单生产者单消费者模型)

    1.引言 本文介绍单生产者单消费者模型的队列.依据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种. 单生产者单消费者模型的队列操作过程是不须要进行加锁的.生产 ...

  2. RabbitMQ(三) HelloWorld 单生产者单消费者示例实现

    一.创建Maven工程,引入RabbitMQ依赖. pom.xml 如下: <?xml version="1.0" encoding="UTF-8"?&g ...

  3. 多线程实现生产者与消费者模式

    生产者-消费者模式的简介: 在实际的软件开发过程中,我们将产生数据的模块称为生产者,处理数据的模块成为消费者.但仅有这两者还不够成为一个生产者-消费者模式,还需要有一个缓冲区(一段内存区域)作为中介, ...

  4. 设计模式-生产者与消费者模式

    最近正在看C++日志的开源代码,其中多个线程需要向文件中写入日志信息,该将该算法逻辑抽象出来的话就是生产者与消费者设计模式.常见的生产者与消费者模式主要分为四类:单生产者与单消费者模式.单生产者与多消 ...

  5. C++实现生产者和消费者模型

    C++实现生产者和消费者模型 C++实现生产者和消费者模型 1.实现细节 2.单生产者-单消费者模型 3.单生产者-多消费者模型 4.多生产者-单消费者模型 5.多生产者-多消费者模型 参考 C++实 ...

  6. Disruptor框架中生产者、消费者的各种复杂依赖场景下的使用总结-我见过最好的Disruptor

    更多高并发知识请访问 www.itkc8.com 非常感谢 https://www.cnblogs.com/pku-liuqiang/p/8544700.html Disruptor是一个优秀的并发框 ...

  7. python生产和消费模型_python queue和生产者和消费者模型

    queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. classqueue.Queue(maxsize=0) #先入先出classqueue.LifoQueue(maxsi ...

  8. mq多个消费者消费一个消息_消息中间件——RabbitMQ(五)快速入门生产者与消费者...

    求关注 快速入门生产者与消费者,SpringBoot整合RabbitMQ! 前言 本章我们来一次快速入门RabbitMQ--生产者与消费者.需要构建一个生产端与消费端的模型.什么意思呢?我们的生产者发 ...

  9. 操作系统(二十五)吸烟者问题-单生产者多消费者问题

    2.3.8 吸烟者问题-单生产者多消费者问题 假设一个系统有三个抽烟者进程和一个供应者进程.每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草.纸和胶水.三个抽烟者中,第 ...

最新文章

  1. PTA基础编程题目集-7-15 计算圆周率
  2. python 中if __name__ = '__main__' 的作用
  3. SQLite实例分析
  4. php 静态方法和非静态方法的调用说明
  5. 通过LDB_PROCESS函数使用逻辑数据库
  6. SQL分组处理气象数据及注意事项
  7. python列表添加元素到中间_python在列表的元素中间插入空行
  8. 上海交大原副校长毛军发院士,履新深圳大学校长
  9. 使用Jenkins搭建自动化测试环境_环境准备_入门试炼01
  10. 源码编译mysql5.5_源码编译安装MySQL5.5
  11. MSComm写串口通信驱动步骤
  12. 一些比较恶心的代码片段
  13. Iphone开发Interface Builder出现Assertion Failure错误
  14. 达芬奇DaVinci Resolve Studio Mac v17.4.6
  15. Activity 生命周期及其栈管理方式
  16. QT-C++ 注册机软件,生成机器码和注册码,支持授权时间
  17. linux c++ 时间戳转换,C++时间戳转换成日期时间的步骤和示例代码
  18. 树梅派应用38:树莓派 SAKS 扩展板挑战应用 之 PM2.5 指示灯
  19. 我的世界java版版本号_我的世界JAVA版1.17版本内容预览
  20. 秋招实习季,教你制作在线简历

热门文章

  1. Linux 高性能服务器网络编程(一)
  2. 黄飞 130702010037
  3. 接入GoogleAnalytics 统计
  4. 南开大学计算机科学与技术研究生院,2021年南开大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  5. 小傻蛋的妹妹跟随小甲鱼学习Python的第二节002
  6. 面试中更多会考核相关技能的项目经验——再论程序员该如何准备面试
  7. 寒風的Cocos2dx之旅之剪刀、石头、布系列专题(2 )
  8. android开发可用技巧
  9. 春季人才市场外企就业竞争最激烈销售岗位需求量最大
  10. Android M Dialer完全总结