1、问题描述:一个系统有三个抽烟者和一个供应者进程。每个抽烟者不停地卷烟并抽掉。卷烟需要三种材料:烟草、纸和胶水。三个抽烟者中,第一个有烟草,第二个有纸,第三个有胶水。供应者无限提供三种材料,每次提供两种,拥有剩下那种材料的抽烟者可以卷一根烟并抽掉,并告诉供应者,供应者再提供下两种材料(让三个消费者轮流抽烟)。
2、关系分析
互斥关系:互斥访问供应区
mutex=1; (由于缓冲区大小为1,可不使用mutex)
同步关系:
(1)供应区有组合1,抽烟者1才能抽烟
offer1=0;
(2)供应区有组合2,抽烟者2才能抽烟
offer2=0;
(3)供应区有组合3,抽烟者3才能抽烟
offer3=0;
(4)抽烟完成后,供应者才能供应相应组合
finish=0; //抽烟是否完成
i=0; //用于实现轮流抽烟
3、代码实现
//吸烟者1
smoker1(){
P(offer1);
卷烟吸烟
V(finish);
}
//吸烟者2
smoker2(){
P(offer2);
卷烟吸烟
V(finish);
}
//吸烟者3
smoker3(){
P(offer3);
卷烟吸烟
V(finish);
}
//供应者
supplier(){
while(1){
if(i==0){
V(offer1);
将组合1放到供应区
}else if(i==1){
V(offer2);
将组合2放到供应区
}else if(i==2){
V(offer3);
将组合3放到供应区
}
i=(++i)%3;
P(finish);
}
}