吸烟者问题-第三十一天

发布时间:2024年01月03日

目录

问题描述

解决问题

是否需要设置一个专门的互斥信号量?

结论


问题描述

该题属于”生产者-消费者”问题,更详细的说应该是“可生产多种产品的单生产者-多消费者”?

解决问题

1、?关系分析:找出题目中描述的各个进程,分析它们之间的同步、互斥关系

互斥关系:桌子可以抽象为容量为1的缓冲区,要互斥访问

  1. 组合一:纸 + 胶水
  2. 组合二:烟草 + 胶水?
  3. 组合三:烟草 + 纸

同步关系:

  1. 桌子上有组合一:第一个抽烟者取走东西
  2. 桌子上有组合二:第二个抽烟者取走东西
  3. 桌子上有组合三:第三个抽烟者取走东西
  4. 发出完成信号:供应者将下一个组合放到桌子上

2、整理思路:根据各进程的操作流程确定P、V操作的大致顺序

取走东西是后操作,有组合(放东西)是前操作,前、V、后、P

3、 设置信号量:设置需要的信号量,并根据题目要求确定信号量初值(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值时多少)

semaphore offer1 = 0;   //桌子组合一的数量
semaphore offer2 = 0;   //桌子组合二的数量
semaphore offer3 = 0;   //桌子组合三的数量
semaphore finish = 0;   //抽烟是否完成
int i = 0;              //用于实现“三个抽烟者轮流抽烟”

4、代码实现?

是否需要设置一个专门的互斥信号量?

缓冲区大小为1,同一时刻,四个同步信号量中至多有一个的值为1,故不需要

结论

1、吸烟者问题可以为我们解决”可以生产多个产品的单生成者“问题提供一个思路。值得吸收的精华是:”轮流让各个吸烟者吸烟“必须需要”轮流的在桌上放组合一、二、三“,注意体会我们是如何使用一个整型变量i实现这个”轮流“过程

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

~over~

文章来源:https://blog.csdn.net/m0_73975164/article/details/135351542
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。