题目
某银行提供1个可同时为2个顾客提供服务的柜员机和可用于10个顾客等待座位。 顾客到达银行时,若有空座位,则到取号机领取一个号,等待叫号。取号机每次仅允许一个顾客使用。 当柜员机有空时(当前有<2个顾客在使用柜员机),系统通过叫号选取一位顾客,并为其服务。请用P、V原语(wait和signal操作)实现上述过程的互斥和同步。要求写出完整的过程,说明各信号量的含义并赋初值。
begin
parbegin
pmach; //柜员机进程
pcus_1; pcus_2; pcus_3; … //顾客进程
parend
end
答案
代码
/*
seets表示空余座位数量的资源信号量,初值为10;
mutex互斥信号量,初值为1,用于实现对取号机的互斥访问;
empty表示柜员机没有提供服务的位置数量(即空位,无顾客在用的位置)的资源信号量,初值为2(一开始有2个空位);
*/
Var seets,mutex,empty,full : semaphore:=10,1,2,0;
pcus_i: //第i个顾客
begin
repeat
wait(seets); //等待空余座位
wait(mutex);//等待取号机空闲
从取号机获得一个号码;
signal(mutex);//离开取号机,使得其他等待取号机的顾客可取号
等待叫号;
signal(seets);//离席去使用柜员机
获得柜员机服务;
服务完成;
signal(empty);//离开柜员机,柜员机增加一个空位
until false
end
pmach: //柜员机进程
begin
repeat
wait(empty);//柜员机有空位,就叫号
叫号;
为顾客服务;
until false
end