问答题
有桥如图所示,车流方向如箭头所示。回答:
问答题
假设该桥上每次只能有一辆车行驶,试用信号灯PV操作实现桥上交通管理。
【正确答案】因为一次只能有一辆车通行,故无需区分方向,可只设一个信号量mutex,用来控制车的通行。
semaphore mutex=1;
car() //包括由南往北和由北往南的车辆
{
驶来
P(mutex);
过桥
V(mutex);
驶离
}
【答案解析】
问答题
假设该桥上不允许有车辆交会,但允许同方向多车一次通行(即桥上可由多个同方向行驶的车)。使用PV操作实现桥上交通的管理。
【正确答案】本题是基于读者-写者问题衍生出来的题目,可以看成是两批互斥的读者,且对于正在读的读者数目有限制。理解每个信号量的意义后,再看进程描述。
int north_count=0; //记录北端获得上桥许可的车辆数
int south_count=0l //记录南端获得上桥许可的车辆数
semaphore mnorth=1; //实现对north_count的互斥访问
semaphore msouth=1; //实现对south_count的互斥访问
semaphore mutex=1; //实现东西两端车辆互斥上桥
Process north car(i)(i=1, 2, 3…) //北端车辆过桥进程
{
P(mnorth);
if(north count==0) //第一辆北端来车
P(mutex); //申请北端车辆上桥
north count++; //获得上桥许可的北端车辆数增1
V(mnorth);
Cross the Bridge;
P(mnorth);
north count--; //获得上桥许可的北端车辆数减1
if(north count==0) //最后一辆获得上桥许可的车辆已过桥
v(mutex); //允许南端车辆上桥
V(mnorth);
}
Process south_car(i) (i=1, 2, 3…)
//南端车辆过桥进程,注释参照north(i)
{
P(msouth);
if(south_count==0)
P(mutex);
south_count++;
V(msouth);
Cross the Bridge;
P(msouth);
south_count--;
if(south_count==0)
V(mutex);
V(msouth);
}
【答案解析】