目录
1.问题描述
要求如下:
- 桌上有纸和胶水,第一个抽烟者取走东西。
- 桌子上有烟草和胶水,第二个抽烟者取走东西。
- 桌子上有烟草和纸,第三个抽烟者取走东西。
- 供应者发出完成信号后将下一个组合放到桌子上。
2.问题分析
本质上这题也属于“生产者-消费者”问题,更详细的说应该是“可生产多种产品的单生产者-多消费者”。
题目中存在的互斥关系如下:
- 戳子抽象为容量为1的缓冲区,要互斥访问。
题目中存在的同步关系如下:
- 桌上有纸和胶水,第一个抽烟者取走东西。
- 桌子上有烟草和胶水,第二个抽烟者取走东西
- 桌子上有烟草和纸,第三个抽烟者取走东西。
- 供应者发出完成信号后将下一个组合放到桌子上。
3.问题实现
3.1 初始化
semaphore offer1 = 0;//桌上组合一的数量
semaphore offer2 = 0;//桌上组合二的数量
semaphore offer3 = 0;//桌上组合三的数量
semaphore finish = 0;//抽烟是否完成
int i = 0;//用于实现“三个抽烟者轮流抽烟”
3.2 生产者
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);
}
3.3 吸烟者
smoker1(){
while(1){
P(offer1);
从桌上拿走组合一;
卷烟;
抽掉;
V(finish);
}
}
smoker2(){
while(1){
P(offer2);
从桌上拿走组合二;
卷烟;
抽掉;
V(finish);
}
}
smoker3(){
while(1){
P(offer3);
从桌上拿走组合三;
卷烟;
抽掉;
V(finish);
}
}