-- 作者: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); } 本人找不到官方的答案,希望知道者能贴出来,谢谢!
|