【正确答案】所用信号量和其他变量设置如下:
整型变量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路段)的互斥问题。因此,可参考读者写者问题的解法。