以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  [原创]巴拿马运河问题的再次讨论  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=57604)


--  作者:cpkug
--  发布时间:1/1/2008 7:11:00 PM

--  [原创]巴拿马运河问题的再次讨论
以下引号部分摘自他人:


巴拿马运河问题
巴拿马运河建在太平洋和大西洋之间,由于太平洋和大西洋水面高度不同,有巨大落差,所以运河中建有T(T≥2)级船闸,并且只能允许单向通行,船闸依次编号为1,2,…,T,由大西洋来的船需要经过船闸T,T-1.,,,2,1通过运河到达太平洋,由太平洋来的船需要经由船闸1,2,…,T-1,T通过运河到达大西洋。使用P,V操作正确解决大西洋和太平洋的船只通航问题。

分析思想:
1) 巴拿马运河大西洋,太平洋两个方向的船设置为两个进程。Atlantic(),Pacific();
2) 当一侧船来到运河,如果另一侧船在过河,则等待;如果自己方船在过河,同时己方船只的总过河船数小于T,则过河;如果己方船在过河,同时己方船只过河总数大于T,则等待。
3) 为了避免饥饿和死锁,必须控制一次过河的船数T。

信息量:
A,P:=1  ——代表两边的船只是否允许通过的闸门。
mutex1,mutex2:=1 ——互斥信息量

程序:
semaphore A=1;
semaphore P=1;
semaphore mutex1=1;
semaphore mutex2=1;
int PshipSum=0,AshipSum=0;
int PshipCur=0,AshipCur=0;


Pacific(){
P(P);
P(mutex1);
PshipSum++; PshipCur++;
if(PshipCur==1)
  P(A);
if(PshipSum==T)
  P(P);
V(P);
V(mutex1)
过河;
P(mutex1);
 PshipCur--;
 if(PshipCur==0){
  V(A);  
  if(PshipSum==T) //先判断是否有P(P),如果有就进行V操作
   V(P);
        PshipSum=0; //每次船闸空了cur==0,都要清空计数器
 }
V(mutex1);

}

Atlantic(){
P(A);
P(mutex2);
AshipSum++; AshipCur++;
if(AshipCur==1)
  P(P);
if(AshipSum==T)
 P(A);
V(A);
V(mutex2);
过河;
P(mutex2);
 AshipCur--;
 if(AshipCur==0){
  V(P);  
  if(AshipSum==T)
   V(A);
        AshipSum=0;
 }
V(mutex2);

}

针对上面所提供的的算法,提供本人的修改方案:

1. 觉得只需要下面变量中的一行就够了,不需要两行;
int PshipSum=0,AshipSum=0;
int PshipCur=0,AshipCur=0;

2. 觉得判断己方船只过河总数大于T时则后续船只应该等待的操作应该在判断是否允许通过闸门之后,不然会出现死锁;

3. 觉得大西洋,太平洋初次对闸门的使用应该进行互斥,不然会出现死锁,拟增加互斥变量gate;


以下是本人修改后的算法,有不足请指教:

信息量:
A,P:=1  ——代表两边的船只是否允许通过的闸门。
gate :=1  ——代表对闸门的使用,大西洋,太平洋初次对闸门的使用应该进行互斥,不然会出现死锁,拟增加互斥变量gate;
mutex1,mutex2:=1 ——互斥信息量

程序:
semaphore A=1;
semaphore P=1;
semaphore gate =1;
semaphore mutex1=1;
semaphore mutex2=1;
int PshipCur=0,AshipCur=0;

//在太平洋过闸门
Pacific(){
P(gate);
if(PshipCur > 0)
 V(gate);
P(P);
P(mutex1);
PshipCur++;
if(PshipCur == 1) {
  P(A);
      V(gate);
    }
V(mutex1)
V(P);
if(PshipCur == (T + 1))
 P(P);    
过闸门;
P(mutex1);
 PshipCur--;
 if(PshipCur==0)
  V(A);  
V(mutex1);
if(PshipCur == T){  
 V(P);
}


//在大西洋过闸门
Atlantic(){
P(gate);
if(AshipCur > 0)
 V(gate);
P(A);
P(mutex2);
AshipCur++;
if(AshipCur==1) {
  P(P);
      V(gate);
    }
V(mutex2);
V(A);
if(AshipCur == (T + 1))
 P(A);
过闸门;
P(mutex2);
 AshipCur--;
 if(AshipCur==0)
  V(P);  
V(mutex2);
if(AshipSum == T)
 V(A);
}


本人找不到官方的答案,希望知道者能贴出来,谢谢!


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms