吸烟者问题-第三十一天

目录

问题描述

解决问题

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

结论


问题描述

吸烟者问题-第三十一天_第1张图片

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

解决问题

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

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

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

同步关系:

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

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

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

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

吸烟者问题-第三十一天_第2张图片

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

4、代码实现 

吸烟者问题-第三十一天_第3张图片

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

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

结论

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

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

~over~

你可能感兴趣的:(计算机操作系统-初阶,linux,ubuntu,windows,centos,gnu)