问题 问答题

在公共汽车上,司机负责开车、停车和驾驶,售票员负责门的开门、关门和售票。基本操作规则是只有停车后,售票员才能开门,只有售票员关门后,司机才能开车。汽车初始状态处于行驶之中。当只有1个司机、2个售票员、2个门、每个售票员负责一个门时的协调操作。请使用P、V原语实现售票员与司机之间的协调操作,说明每个信号量的含义、初值和值的范围。

答案

参考答案:确定P、V操作的位置:
司机操作中,是否关前门没关则等待,这是一个P操作,P (Door1);是否关后门没关则等待,这是一个P操作,P (Door2);
司机操作中,设立启动标志,通知前、后门售票员可以售票,这是两个V操作,V(T1),V(T2);
司机操作中,设立停车标志,通知前、后门售票员可以开门,这是两个V操作,V(S1),V(S2);
前门售票员售票操作中,汽车是否启动没启动则等待,这是一个P操作,P(T1)。
前门售票员开门操作中,是否停车没停则等待,这是一个P操作,P(S1);
前门售票员关门操作中,设立关门标志,这是一个V操作,V(Door1);
后门售票员售票操作中,汽车是否启动没启动则等待,这是一个P操作,P(T2)。
后门售票员开门操作中,是否停车没停则等待,这是一个P操作,P(S2);
后门售票员关门操作中,设立关门标志,这是一个V操作,V(Door2);
由于汽车初始状态处于行驶之中,所以Door1=Door2=0,T1=T2=0(不严格),S1=S2=0,所有信号量的取值范围都是-1~1。
Semaphore Door1=Door2=1;
Semaphore S1=S2=0;
Semaphore T1=T2=1;
main()
{
cobegin
driver();busserver 1();busserver 2();
coend
}
driver()
{ do while T
{P(Door1);p(Door2);
启动车辆;
V(T1);V(T2);
正常行车;
到站停车;
V(S1);V(S2);
}
}
busserver 1()
{ do while T
{
P(T1);
售票;
p(S1);
开前门;
关前门;
V(Door1);
}
}
busserver 2()
{ do while T
{
p(T2);
售票;
P(S2);
开后门;
关后门;
V(Door2);
}
}

解析: 本题目考查进程的同步问题。司机的启动、停车操作需要与两个售票员的关门、售票、开门操作同步。

多项选择题
判断题