10.司机和售票员之间要协同工作:一方面只有售票员把车门关好了司机才能开车,因此售票员关好车门应通知司机开车;另一方面只有当汽车已经停下时,售票员才能开门让乘客上下客,司机停车后应该通知售票员,假定某辆汽车有一名司机和两名售票员,汽车当前正在始法站停车上客,
分析: 活动规律:
司机 售票员(2名)
启动车辆 上乘客
正常行驶 关车门
到站停车 售票
开车门
下乘客
售票员关好车门应该通知司机开车,因此要设置一个信号量用于司机判断是否可以启动车辆;此外,当汽车到站停下时,司机停车后要通知售票员,所以也要设置一个信号量用于通知售票员打开车门.由于有两名售票员,因此相应的信号量都需要设置两个.
注:这是售票员优先的方式,若以司机优先的方式,程序如下:
分析: 活动规律:
司机 售票员(2名)
启动车辆 上乘客
正常行驶 关车门
到站停车 售票
开车门
下乘客
售票员关好车门应该通知司机开车,因此要设置一个信号量用于司机判断是否可以启动车辆;此外,当汽车到站停下时,司机停车后要通知售票员,所以也要设置一个信号量用于通知售票员打开车门.由于有两名售票员,因此相应的信号量都需要设置两个.
begin
var stop1 = 0 ,stop2 = 0 ,run1 = 0 ,run2 = 0 :semaphore;
cobegin
process driver
begin
repeat
p(run1);
p(run2);
启动车辆;
正常行驶;
到站停车;
v(stop1);
v(stop2);
end
process conductor1
begin
repeat;
上乘客;
关车门;
v(run1);
售票;
p(stop1);
开车门;
下乘客;
end
process conductor2
begin
repeat;
上乘客;
关车门;
v(run2);
售票;
p(stop2);
开车门;
下乘客;
end
coend
end
var stop1 = 0 ,stop2 = 0 ,run1 = 0 ,run2 = 0 :semaphore;
cobegin
process driver
begin
repeat
p(run1);
p(run2);
启动车辆;
正常行驶;
到站停车;
v(stop1);
v(stop2);
end
process conductor1
begin
repeat;
上乘客;
关车门;
v(run1);
售票;
p(stop1);
开车门;
下乘客;
end
process conductor2
begin
repeat;
上乘客;
关车门;
v(run2);
售票;
p(stop2);
开车门;
下乘客;
end
coend
end
注:这是售票员优先的方式,若以司机优先的方式,程序如下:
begin
var stop1 = 0 ,stop2 = 0 ,run1 = 0 ,run2 = 0 :semaphore;
cobegin
process driver
begin
repeat
正常行驶;
到站停车;
v(stop1);
v(stop2);
p(run1);
p(
var stop1 = 0 ,stop2 = 0 ,run1 = 0 ,run2 = 0 :semaphore;
cobegin
process driver
begin
repeat
正常行驶;
到站停车;
v(stop1);
v(stop2);
p(run1);
p(