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

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 计算机考研交流 』 → 面包师问题和巴拿马问题(PV) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4767 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 面包师问题和巴拿马问题(PV) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     shun 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(汇编考了97分!)
      文章:86
      积分:373
      门派:XML.ORG.CN
      注册:2006/7/19

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

    以下的代码都是Runningwulf提供的答案

    面包师问题
    Semaphore ClientQueue=0; //记录顾客等待队列
    Semaphore Customer = 0; //记录提供给柜员可以办理业务的客户数量
    Semaphore Clientmutex=1; //顾客的互斥信息量
    Int ClerkState[n];
    For(int i=0; i<n; i++)
       ClerkState[i]=1;

    Void Client (){
      P(ClientQueue);
      P(Clientmutex);
      V(Customer);
                     [color=#FF0000]For(int i=0; i<0; i++){  //扫描到第一个空闲的柜员后推出,既到该柜员处办理
       If(ClerkState[i]==1){
        ClerkState[i]=0;
        Break;
       }
      } [/color]  //如果扫描过程中没有空闲的呢?是否要改为while
      V(Clientmutex);
      到第i个柜员处办理业务;
    }


    巴拿马问题

    巴拿马运河问题
    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);
               }

    Pacific(){
     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);
                }


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/30 10:40:00
     
     buddha 帅哥哟,离线,有人找我吗?
      
      
      等级:大四(每天看1小时莱昂氏)
      文章:164
      积分:1022
      门派:XML.ORG.CN
      注册:2006/5/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给buddha发送一个短消息 把buddha加入好友 查看buddha的个人资料 搜索buddha在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看buddha的博客2
    发贴心情 
    面包师问题不一定正确.
    巴拿马运河不必那么麻烦.可以看做两个读者优先的读者.
    不可尽信...
    :)
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/1 12:35:00
     
     cpkug 帅哥哟,离线,有人找我吗?
      
      
      等级:大三暑假(ITELS考了7分!)
      文章:124
      积分:877
      门派:XML.ORG.CN
      注册:2007/7/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cpkug发送一个短消息 把cpkug加入好友 查看cpkug的个人资料 搜索cpkug在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看cpkug的博客3
    发贴心情 
    巴拿马运河问题:
    1. 觉得只需要下面变量中的一行就够了,不需要两行;
    int PshipSum=0,AshipSum=0;
    int PshipCur=0,AshipCur=0;

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

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

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

    信息量:
    A,P:=1  ——代表两边的船只是否允许通过的闸门。
    gate :=1  ——代表对闸门的使用。

    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);
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/1 18:57:00
     
     xianyun 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(面向对象是个好东东!)
      文章:92
      积分:547
      门派:XML.ORG.CN
      注册:2007/3/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xianyun发送一个短消息 把xianyun加入好友 查看xianyun的个人资料 搜索xianyun在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给xianyun 引用回复这个贴子 回复这个贴子 查看xianyun的博客4
    发贴心情 
    关于巴拿马运河问题和银行问题 05 年助教给了一个答案,这个答案将问题考虑得令人惊讶
    答案如下:
    巴拿马运河建在太平洋和大西洋之间。由于太平洋和大西洋水面高度不同,有巨大落差,所以运河中修建有T(T>=2)级船闸,并且只能允许单向通行。船闸依次编号为1,2,……,T。由大西洋来的船需经由船闸T,T-1,……,2,1通过运河到太平洋;由太平洋来的船需经由船闸1,2,……,T-1,T通过运河到大西洋。
       试用P,V操作正确解决大西洋和太平洋的船只通航问题。
    答:来自不同方向的船只对船闸要互斥使用。但如过有同方向的船只正在通行,则不用等待。
    对一个船闸设以下变量:
    PtoAcnt   整型,记录此船闸正由太平洋往大西洋航行的船只  初值0。
    AtoPcnt   整型,记录此船闸正由大西洋往太平洋航行的船只  初值0。
    MutexA     信号量,对PtoAcount互斥  初值1
    MutexB     信号量,对AtoPcount互斥  初值1
    Lock        信号量  初值1

    太平洋到大西洋的船:
    P(mutexA);
    PtoAcnt =PtoAcnt+1;
    if PtoAcnt = = 1
     then P(Lock);
    V(mutexA);

    P(mutexA)
    PtoAcnt=PtoAcnt-1;
    if PtoAcnt = = 0;
     then V(Lock);
    V(mutexA);

    大西洋到太平洋的船:
    P(mutexB);
    AtoPcnt:=AtoPcnt+1;
    if AtoPcnt = =1;
     then P(Lock);
    V(mutexB);

    P(mutexB)
    AtoPcnt =AtoPcnt-1;
    if AtoPcnt = =0;
     then V(Lock);
    V(mutexB);
    某银行有人民币储蓄业务,由 n个柜员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个柜台人员空闲下来,就叫下一个号。试用P,V操作正确编写柜台人员和顾客进程的程序。
    答:
    Semaphore counter;  //柜台数,初值为n
    Semaphore waiting;  //当前等待的顾客数;初值为0;
    Semaphore mutex;    //互斥对顾客号数的访问。初值为1

    Customer_i
    {
       int num;
       P(mutex);
       num = COSTOMER_NUM++;
       V(mutex);
       V(waiting);  //请求服务
       P(counter);  //等待叫号
       接受服务;
       离开;
       P(mutex);
       COSTOMER_NUM--;
       V(mutex);
    }

    Clerk_i
    {
       While(true){
    P(waiting);  //等待顾客
    V(counter);  //叫号
    服务;
    }
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/8 0:34:00
     
     sun120409 帅哥哟,离线,有人找我吗?天蝎座1986-11-13
      
      
      等级:大二(研究汇编)
      文章:60
      积分:298
      门派:XML.ORG.CN
      注册:2008/3/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给sun120409发送一个短消息 把sun120409加入好友 查看sun120409的个人资料 搜索sun120409在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看sun120409的博客5
    发贴心情 
    非常感谢 ,正找这个呢,感谢LZ辛勤劳动
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/3/19 19:51:00
     
     GoogleAdSense天蝎座1986-11-13
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 计算机考研交流 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2026/4/8 6:00:10

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

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