【正确答案】本题是一个有限缓冲区的生产者消费者问题,关键是找到缓冲区资源,以及谁是生产者、谁是消费者。 本题中烟草、纸和火柴应该看作是产品,桌子是缓冲区。问题是有几种产品。烟草、纸和火柴三种原料又不能简单地看成是三种产品,因为它们并不是以单独的形式被三个吸烟者进程所竞争的,而是以固定的组合被三个进程所申请的。因此可以考虑:设置三个信号量r、s和t,分别代表三种原料组合,即r表示烟草和纸,s表示纸和火柴,t表示烟草和火柴,初值均为0;桌面上一次只能放一种组合,可以看作是放一个产品的缓冲区,设置信号量empty初值为1,控制经销商往桌子上放原料;对于三个吸烟者的申请动作也要加以判断,用三个变量smoker1、smoker2、smoker3,初值为false,当为true时,表示申请资源,得到资源后置为false。四个进程循环往复,并发执行。 parbegin 经销商进程: Begin P(empty); if smoker1=true then Begin 放烟草和纸; V(r); End if smoker2=true then Begin 放纸和火柴; V(s); End if smoker3=true then Begin 放烟草和火柴; V(t); End End 吸烟者1进程: Begin smoker1:=true; P(r); 取走原料; smoker1:=false; V(empty); Smoking; End 吸烟者2进程: Begin smoker2:=true; P(s); 取走原料; smoker2:=false; V(empty); Smoking; End 吸烟者3进程: Begin smoker3:=true; P(t); 取走原料; smoker3:=false; V(empty); Smoking; End Parend