问答题 有座东西方向架设、可双向通行的单车道简易桥,最大载重负荷为4辆汽年。请定义合适的信号量,正确使用P操作、V操作,实现双向车辆的过桥过程。
【正确答案】
【答案解析】设置4个信号量:
S:代表桥的互斥使用的信号量,初值为1;
Scounteast:代表由东向西方向的车辆计数器的互斥使用的信号量,初值为1;
Scountwest:代表由西向东方向的车辆计数器的互斥使用的信号量,初值为1;
Scount4:代表桥上车辆计数器的信号量,初值为4。
算法如下:
Semaphore:S,Scounteast,Scountwest,Scount4;
int Counteast,Countwest;
S=1;Scounteast=1;Scountwest=1;Scount4=4;
Counteast=0;
Countwest=0;
Program_east() {
P(Scounteast);
if(Counteast==0) then P(S);
Counteast=Counteast+1;
V(Scounteast);
P(Scount4);
过桥:
V(Scount4);
P(Scounteast);
Counteast=Counteast-1;
if(Counteast==0) then V(S);
V(Scounteast);
{
Program_west() {
P(Scountwest);
if(Countwest==0) then P(S);
Countwest=Countwest+1;
V(Scountwest);
P(Scount4);
过桥:
V(Scount4);
P(Scountwest);
Countwest=Countwest-1;
if(Countwest==0) then V(S);
V(Scountwest);
} [解析] 这也是一个读者/写者类型的同步互斥问题。有两组读者或写者:从东向西的车流和从西向东的车流。共享的资源是可双向通行的单车道简易桥,即双向过桥的车辆对桥的使用是互斥的,同方向上允许有多辆车辆同时过桥,但是同时过桥的车辆数目不能大于4辆。因此,可以按照通常的读者/写者问题进行处理,但在同组读者使用资源的过程中需要增加信号量的控制,以满足最大载重负荷为4辆汽车的条件。