2.3_9 吸烟者问题

news/2024/11/23 5:20:16/

2.3_9 吸烟者问题

问题描述

问题分析

假设一个系统有三个抽烟者进程一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)

本质上这题也属于“生产者-消费者”问题,更详细的说应该是“可生产多种产品的单生产者-多消费者”。

  1. 关系分析。找出题目中描述的各个进程,分析它们之间的同步、互斥关系。
  2. 整理思路。根据各进程的操作流程确定P、V操作的大致顺序
  3. 设置信号量。设置需要的信号量,并根据题目条件确定信号量初值。(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少)

组合一:纸+胶水
组合二:烟草+胶水
组合三:烟草+纸

同步关系(从事件的角度来分析):
桌上有组合一→第一个抽烟者取走东西
桌上有组合二→第二个抽烟者取走东西
桌上有组合三→第三个抽烟者取走东西
发出完成信号→供应者将下一个组合放到桌上

实现方式

semaphore offer1=0; 	//桌上组合一的数量
semaphore offer2=0;		//桌上组合二的数量
semaphore offer3=0;		//桌上组合三的数量
semaphore finish=0;		//抽烟是否完成provider(){while(1){if(i==0){将组合一放桌上;V(offer1);}else if(i==1){将组合二放桌上;V(offer2);}else if(i==2){将组合三放桌上;V(offer3);}i=(i+1)%3;P(finish);}
}smoker1(){while(1){P(offer1);从桌上拿走组合一;卷烟;抽掉;V(finish);}
}smoker2(){while(1){P(offer2);从桌上拿走组合二;卷烟;抽掉;V(finish);}
}smoker3(){while(1){P(offer3);从桌上拿走组合三;卷烟;抽掉;V(finish);}
}

知识回顾与重要考点

吸烟者问题可以为我们解决“可以生产多个产品的单生产者”问题提供一个思路。
值得吸取的精华是:“轮流让各个吸烟者吸烟”必然需要“轮流的在桌上放上组合一、二、三”,注意体会我们是如何用一个整型变量 i 实现这个“轮流”过程的。
如果题目改为“每次随机地让一个吸烟者吸烟”,我们有应该如何用代码写出这个逻辑呢?

若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的“事件”发生之后的位置。


http://www.ppmy.cn/news/1345877.html

相关文章

【保姆级教程|YOLOv8改进】【6】快速涨点,SPD-Conv助力低分辨率与小目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

远程主机可能不符合 glibc 和 libstdc++ Vs Code 服务器的先决条件

vscode连接远程主机报错,原因官方已经公布过了,需要远程主机 glibc>2.28,所以Ubuntu18及以下版本没法再远程连接了,其他Linux系统执行ldd --version查看glibc版本自行判断。 解决方案建议: 不要再想升级glibc了 问题…

SpringBoo+Vue构建简洁日志文件查看系统

点击下载《SpringBooVue构建日志文件查看系统(源代码)》 1. 前言 想必经常做java开发的小伙伴,其大多数服务都是运行在linux系统上的,当遇到一些比较棘手的bug需要处理时,经常要上服务器去捞日志,然后通过…

探索设计模式的魅力:从单一继承到组合模式-软件设计的演变与未来

设计模式专栏:http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时,我们如何优雅地处理单个对象与组合对象的一致性问题?组合模式(Composite Pattern)为此提供了一种简洁高效的解决方案。通过本…

MySQL 小技巧:xtrabackup 软件包的下载及安装

案例:xtrabackup 软件包的下载及安装 软件包下载:Index of /percona/centos/7/RPMS/x86_64/ CentOS7 默认的数据库版本比较老,因此建议使用 xtrabackup 2.4 版本 // CentOS7 默认的数据库版本比较老,因此建议使用 xtrabackup 2.4 版本 // 安装 CentOS7 默…

Zoho Creator低代码平台:克服移动应用开发四大挑战的利器

多年来,移动应用程序开发经历了翻天覆地的变化。手机屏幕上充斥着手机制造商开发的预构建应用程序的日子已经一去不复返了。今天,由无数应用程序开发人员开发的各种类型的应用程序主宰了您的移动设备。 除了多个操作系统之外,设备还具有各种…

计算机设计大赛 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 🔥 优质竞赛项目系列,今天…

避免Arrays.asList陷阱:优雅处理结构性修改的方法

临近年终,项目交付排期比较紧张,导致很多时候,Code Review 往往是走马观花,没有严格执行。最近,一个实习生就产生了一个十分低级的代码BUG。笔者感觉这个问题,对于实习生,尤其是刚入职的 应届 J…