回 帖 发 新 帖 刷新版面

主题:[讨论]我就不信这里没有人真正懂操作系统!!!!

题目:
考虑只使用一个单行道对一隧道进行模拟.为了避免死锁,必须防止汽车同时在两端进入隧道.一旦一辆汽车进入隧道,则同一个方向上的其他汽车可以立即跟随进入.写出伪代码.最好用管程,可以不考虑饥饿,如果能考虑当然更好!

回复列表 (共4个回复)

沙发

........

板凳

真不希望如此

3 楼

终于想出来了
monitor s{
 int up_wait=0,up_num=0;//up_wait表示当向上允许通过时可以通过的车辆数,up_num表示当前有向上方向车辆正在通过隧道而又有新准备向上的车
 int down_wait=0;down_num=0;//down_wait表示向下允许通过时可以通过的车辆数,down_num表示当前向下方向车辆正在通过隧道而又有新准备向下的车
 condition up,down;
 int uping=0,downing=0;//分别为请求信号
 
 request_up(){
    if(uping) up_num++;up.wait;
    if(downing) up_wait++;up.wait;
        uping=1;
 }


 release_up(){
    uping=0;
    if(up_wait>0) up.signal;
    else {down_wait=down_wait+down_num;down.signal;}
 }


 request_down(){
    if(uping) down_wait++;down.wait;
    if(downing) down_num++;down.wait;
        downing=1;
 }
  
 release_down(){
    downing=0;
    if(down_wait>0) down.signal;
    else {up_wait=up_wait+up_num;up.signal;}
 
 }
}

4 楼

楼主可以看看信号量集后面举的几个特例情况

我来回复

您尚未登录,请登录后再回复。点此登录或注册