问答题 有桥如图所示,车流方向如箭头所示。回答:
问答题 假设该桥上每次只能有一辆车行驶,试用信号灯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); }
【答案解析】