问答题 设A、B两点之间是一段东西向的单行车道,现在要设计一个AB路段自动管理系统,管理规则如下:当AB间有车辆在行驶时,同方向的车可以同时驶入AB段,但另一方向的车必须在AB段外等待;当AB段之间无车辆行驶时,到达AB段的任一方向的车都可进入AB段,但不能从两个方向同时驶入,即只能有一个方向的车驶入;当某方向在AB段行驶的车辆驶出了AB段且暂无车辆进入AB段时,应让另一方向等待的车辆进入AB段行驶。试用信号量和wait、signal操作管理AB路段车辆的行驶。

【正确答案】所用信号量和其他变量设置如下:
整型变量Car_A,初值为0,用于对从A点(东)驶入AB段的车辆进行记数。
整型变量Car_B,初值为0,用于对从B点(西)驶入AB段的车辆进行记数。
互斥信号量mutex,初值为1,用于实现不同方向的第一辆车互斥驶入AB路段。
互斥信号量ma,初值为1,用于实现东西向的车互斥地访问计数器变量Car_A。
互斥信号量mb,初值为1,用于实现西东向的车互斥地访问计数器变量Car_B。
semaphore mutex=1,ma=1,mb=1;
int Car_A=0,Car_B=0;
main(){
Cobegin
AToB();
BToA();
Coend
}
东西向(即AB向)行驶的车辆i
AToB()
{ while(1){
wait(ma);
Car_A++;
if(Car_A==1) wait(mutex);
signal(ma);
车辆从A点通过AB路段到达B点;
wait(ma);
Car_A--;
if(Car_A==0) signal(mutex);
signal(ma);
}
}
西东向(即BA向)行驶的车辆j
BToA()
{ while(1){
wait(mb);
Car_B++:
if(Car_B==1) wait(mutex);
signal(mb);
车辆从B点通过AB路段到达A点;
wait(mb);
Car_B--;
if(Car_B==0) signal(mutex);
signal(mb);
}
}
【答案解析】[解析] 本题属于读者写者问题的变形,相当于两组读者(即两个方向的车辆)使用同一个共享文件(即AB路段)的互斥问题。因此,可参考读者写者问题的解法。