假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。一个抽烟的有烟草,另一个有纸,第三个有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者一个信号告诉完成了,供应者就会放另外两种材料在桌上,这种过程一直重复(让三个抽烟者轮流地抽烟)。请用信号量及PV操作实现这四个进程的并发执行。
参考答案:(此题与爸爸放苹果和桔子,女儿取桔子,儿子取苹果一题类似。)设置四个信号量empty一1表示桌子是否为空,yan=0表示是否能满足有烟草者的需要,zhi=0表示是否能满足有纸者的需要,huo=0表示是否能满足有火柴者的需要。
有烟草者: { 拿走纸和火柴; 做烟;
while(1) P(yan); V(empty); 抽烟;
} 抽烟; 做烟; then V(yan)
} 抽烟; else if放烟草和火柴
}
then V(zhi)
else if放烟草和纸
有纸者:
while(1) 有火柴者:
{ while(1) 经销商: then V(huo);
P(zhi); { while(1) }
拿走烟草和火柴; P(huo); {
V(empty); 拿走烟草和纸; P(empty);
做烟; V(empty); if放纸和火柴