新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 计算机科学论坛计算机理论与工程『 计算机考研交流 』 → pv巴拿马运河问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4735 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: pv巴拿马运河问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     tonystill 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究C++)
      文章:38
      积分:211
      门派:XML.ORG.CN
      注册:2006/7/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给tonystill发送一个短消息 把tonystill加入好友 查看tonystill的个人资料 搜索tonystill在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看tonystill的博客楼主
    发贴心情 pv巴拿马运河问题

    巴拿马运河问题

    巴拿马运河问题
    巴拿马运河建在太平洋和大西洋之间,由于太平洋和大西洋水面高度不同,有巨大落差,所以运河中建有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);
      PshipSum=0;
      if(PshipSum==T)
       V(P);
     }
    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);
      AshipSum=0;
      if(AshipSum==T)
       V(A);
     }
    V(mutex2);

    }


    各位大哥,大家好,这是在此网站runningwulf大哥做的,我有点儿疑惑
    PshipSum=0;
    if(PshipSum==T)
    V(P)
    都已经让PshipSum==0了,为什么还if(PshipSum==T)呢?
    希望大家指点,感谢runningwulf大哥做的pv给我很大帮助。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/6 23:08:00
     
     runningwulf 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:33
      积分:201
      门派:XML.ORG.CN
      注册:2006/5/20

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给runningwulf发送一个短消息 把runningwulf加入好友 查看runningwulf的个人资料 搜索runningwulf在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看runningwulf的博客2
    发贴心情 
    感谢tonystill,这块好像还真是有问题,语句的顺序错了,应该是
    过河;
    P(mutex1);
    PshipCur--;
    if(PshipCur==0){
          V(A);

          if(PshipSum==T)      //先判断是否有P(P),如果有就进行V操作
             V(P);
          PshipSum=0;         //每次船闸空了cur==0,都要清空计数器

    }
    V(mutex1);

    多谢指出错误!!!!!!:)

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/7 18:41:00
     
     xiaonaoling 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:125
      门派:XML.ORG.CN
      注册:2006/8/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xiaonaoling发送一个短消息 把xiaonaoling加入好友 查看xiaonaoling的个人资料 搜索xiaonaoling在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看xiaonaoling的博客3
    发贴心情 
    Pacific(){
    P(P);
    P(mutex1);
    PshipSum++; PshipCur++;
    if(PshipCur==1)
      P(A);
    .......


    Atlantic(){
    P(A);
    P(mutex2);
    AshipSum++; AshipCur++;
    if(AshipCur==1)
      P(P);
    .......

    如果两个同时进行 会不会发生死琐 保持与等待  A  p

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/11 14:32:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 计算机考研交流 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/11 14:21:25

    本主题贴数3,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms