目录
问题描述
解决问题
是否需要设置一个专门的互斥信号量?
结论
问题描述
该题属于”生产者-消费者”问题,更详细的说应该是“可生产多种产品的单生产者-多消费者”
解决问题
1、 关系分析:找出题目中描述的各个进程,分析它们之间的同步、互斥关系
互斥关系:桌子可以抽象为容量为1的缓冲区,要互斥访问
- 组合一:纸 + 胶水
- 组合二:烟草 + 胶水
- 组合三:烟草 + 纸
同步关系:
- 桌子上有组合一:第一个抽烟者取走东西
- 桌子上有组合二:第二个抽烟者取走东西
- 桌子上有组合三:第三个抽烟者取走东西
- 发出完成信号:供应者将下一个组合放到桌子上
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~