使用信号量和PV操作实现公交车上司机进程和售票员进程协同活动
问题:
设公共汽车上,司机和售票员的活动分别是:
司机的活动: 启动车辆,正常行车,到站停车;
售票员的活动:关车门,售票,开车门;
用PV操作实现它们的同步。
问题分析:
在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:
① 售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆。
② 在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。
因此司机启动车辆的动作必须与售票员关车门的动作取得同步,售票员开车门的动作也必须与司机停车取得同步。
在本题中,应设置两个信号量:S1、S2。
S1表示是否允许司机启动汽车,初值为0;
S2表示是否允许售票员开门,其初值为0。
用PV操作解题如下:
semaphore Sl=0; //司机启动汽车
semaphore S2=0; //售票员开门
main()
{
cobegin
driver();
busman();
coend
}
driver()
{
while(1)
{
P(S1); //初始S1=0,P(S1)后S1=-1,司机无法启动车辆,需等待售票员执行关门操作(V(S1)),需售票员关好门,唤醒司机,司机才能启动车辆
启动车辆;
正常行车;
到站停车;
V(S2); //汽车到站,唤醒售票员开车门
}
}
busman()
{
while(1){
关车门;
V(S1); //售票员已关好车门,执行V(S1),唤醒司机启动车辆
售票;
P(S2); //售票员打开车门,需S2>0时。初始S2=0,售票员不能打开车门,需等司机执行V(S2)操作,唤醒售票员开门,售票员才能打开车门
开车门;
乘客上下车;
}
}