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

    >> 研友的交流园地,讨论关于计算机考研的方方面面。
    [返回] 计算机科学论坛计算机理论与工程『 计算机考研交流 』 → 讨论一下写者优先问题的<官方>答案 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 18966 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 讨论一下写者优先问题的<官方>答案 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     lionx 帅哥哟,离线,有人找我吗?
      
      
      等级:大四(GRE考了1500分!)
      文章:144
      积分:1074
      门派:Lilybbs.net
      注册:2006/7/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lionx发送一个短消息 把lionx加入好友 查看lionx的个人资料 搜索lionx在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给lionx  引用回复这个贴子 回复这个贴子 查看lionx的博客楼主
    发贴心情 讨论一下写者优先问题的<官方>答案

    void reader()
    {
    P(mutex3);
       P(read);
          P(mutex1);
             readcount++;
             if (readcount==1)
                P(write);
          V(mutex1);
       V(read);
    V(mutex3);
    reading;
    P(mutex1);
       readcount--;
       if (readcount==0)
          V(write);
    V(mutex1);
    }
    void writer()
    {
    P(mutex2);
       writecount++;
       if (writecount==1)
          P(read);
    V(mutex2);
    P(write);
       writing;
    V(write);
    P(mutex2);
       writecount--;
       if (writecount==0)
          V(read);
    V(mutex2);
    }
    06年11月习题课的答案

    下面是我的分析:
    问题:写者在写,则其余写者和读者等待;写者写完,优先释放下一个写者;
    读者在读,若无写者等待,则其他读者可读;读者在读,若有写者等待,则其他读者等待。

    互斥:写者之间互斥(故设置信号量write(初值为1)),读者和写者之间互斥(read(1));读者之间不互斥;
    记录当前读者个数(readcount(0))和写者个数(writecount(0)),读者对readcount互斥访问(mutex1(1)),写者对writecount互斥访问(mutex2(1));
    为保证在有读者等待的时候,新写者到来也优先释放写者,让等待的读者继续等待,不能将读者和写者阻塞在同一队列上(mutex3(1))。

    阻塞分析:当有写者在写时,其余写者阻塞在write上,第一个读者阻塞在read上,其他的读者堵塞在mutex3上。当一个写者写完后,若有写者等待,则唤醒一个写者,否则唤醒第一个读者,由第一个读者唤醒其余读者。
    当有读者在读时,一读者R通过P(read)还未V(read),此时新到来的第一位写者W阻塞在read上,其余写者阻塞在mutex2上;新到来的第一位读者R1阻塞在read上,其余读者阻塞在mutex3上:(1)若正在等待的第一位写者W先于读者R1到来,则他先被读者R释放,接着W会释放其余写者,使原阻塞在mutex2上的写者通过mutex2,重新阻塞在write上,而所有等待的读者仍然阻塞在原来的地方;(2)否则读者R先释放读者R1,R1代替R的位置,原来等待在mutex3上的第一位读者R2被阻塞在read上,但此时R2在read等待队列上必处于写者W之后,成为情况(1)。因此可以看到,在上面的方案中,新写者到来后,最多再放行一位读者。

    这里的mutex1好像没什么作用,因为read的初值是1,故而read可以保护readcount而无需mutex1了。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/11 16:02:00
     
     EagleSoaring 帅哥哟,离线,有人找我吗?金牛座1982-5-8
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:114
      积分:828
      门派:W3CHINA.ORG
      注册:2006/7/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给EagleSoaring发送一个短消息 把EagleSoaring加入好友 查看EagleSoaring的个人资料 搜索EagleSoaring在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看EagleSoaring的博客2
    发贴心情 
    还是有用的,read可以保护上面的readcount,保护不了下面的readcount
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/11 19:52:00
     
     lionx 帅哥哟,离线,有人找我吗?
      
      
      等级:大四(GRE考了1500分!)
      文章:144
      积分:1074
      门派:Lilybbs.net
      注册:2006/7/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lionx发送一个短消息 把lionx加入好友 查看lionx的个人资料 搜索lionx在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给lionx  引用回复这个贴子 回复这个贴子 查看lionx的博客3
    发贴心情 
    呵呵是我说错了,我是说
    void reader()
    {
    P(mutex3);
       P(read);
          P(mutex1);
             readcount++;
             if (readcount==1)
                P(write);
          V(mutex1);
    这里的P(mutex1)和V(mutex1)好像没什么用
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/11 22:41:00
     
     albani 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(汇编考了97分!)
      文章:89
      积分:500
      门派:XML.ORG.CN
      注册:2007/7/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给albani发送一个短消息 把albani加入好友 查看albani的个人资料 搜索albani在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看albani的博客4
    发贴心情 
    有用的,保护readcount,新来的读者是不会同时修改readcount
    但是可能和下面完成的读者发生错误
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/11 22:54:00
     
     EagleSoaring 帅哥哟,离线,有人找我吗?金牛座1982-5-8
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:114
      积分:828
      门派:W3CHINA.ORG
      注册:2006/7/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给EagleSoaring发送一个短消息 把EagleSoaring加入好友 查看EagleSoaring的个人资料 搜索EagleSoaring在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看EagleSoaring的博客5
    发贴心情 
    去掉上面的P(mutex1)和V(mutex1) 之后,
    readcount会出错
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/11 23:15:00
     
     okdavinci 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(Java考了96分!)
      文章:111
      积分:480
      门派:XML.ORG.CN
      注册:2007/3/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给okdavinci发送一个短消息 把okdavinci加入好友 查看okdavinci的个人资料 搜索okdavinci在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看okdavinci的博客6
    发贴心情 
    reader()
    {
       P(read)
        P(mutex)
       V(read)
         readcount ++
        if(readcount == 1)
           P(write)
       V(mutex)

      读
      
      P(mutex)
      readcount --
      if(readcount == 0)
         V(write)
    V(mutex)
    ==============
    读者是这样应该可以吧?
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/12 23:05:00
     
     albani 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(汇编考了97分!)
      文章:89
      积分:500
      门派:XML.ORG.CN
      注册:2007/7/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给albani发送一个短消息 把albani加入好友 查看albani的个人资料 搜索albani在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看albani的博客7
    发贴心情 
    以下是引用okdavinci在2007-12-12 23:05:00的发言:
    reader()
    {
        P(read)
         P(mutex)
        V(read)
          readcount ++
         if(readcount == 1)
            P(write)
        V(mutex)

       读
       
       P(mutex)
       readcount --
       if(readcount == 0)
          V(write)
      V(mutex)
    ==============
    读者是这样应该可以吧?
    }


    这样感觉问题不是太大,但是好像没有充分体现写者优先,例如,现在有一写者在写,来了N个读者全部被挂在read上,写者完成后,读者一个一个的释放,在还没全释放完的时候来了个写者,这个写者只能等这N个读者完成后才能写。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/13 23:10:00
     
     EagleSoaring 帅哥哟,离线,有人找我吗?金牛座1982-5-8
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:114
      积分:828
      门派:W3CHINA.ORG
      注册:2006/7/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给EagleSoaring发送一个短消息 把EagleSoaring加入好友 查看EagleSoaring的个人资料 搜索EagleSoaring在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看EagleSoaring的博客8
    发贴心情 
    同意楼上的
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/14 3:14:00
     
     lionx 帅哥哟,离线,有人找我吗?
      
      
      等级:大四(GRE考了1500分!)
      文章:144
      积分:1074
      门派:Lilybbs.net
      注册:2006/7/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lionx发送一个短消息 把lionx加入好友 查看lionx的个人资料 搜索lionx在『 计算机考研交流 』 的所有贴子 点击这里发送电邮给lionx  引用回复这个贴子 回复这个贴子 查看lionx的博客9
    发贴心情 
    是的,所以我认为官方的答案还是不错的。要是想要绝对的写者优先,应该要读者也能访问writecount
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/14 11:48:00
     
     zewixi 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:20
      积分:451
      门派:XML.ORG.CN
      注册:2007/6/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zewixi发送一个短消息 把zewixi加入好友 查看zewixi的个人资料 搜索zewixi在『 计算机考研交流 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看zewixi的博客10
    发贴心情 
    第二类读者-写者问题的如下解法:
    众大牛帮忙找找错误吧!谢过先!

    int readCnt=0;       //表示当前读者数目,初值为0
    int writeCnt=0;      //表示当前写者数目,初值为0
    Semaphore mutexRC;   //互斥对readCnt变量的使用,初值为1
    Semaphore mutexWC;   //互斥对writeCnt变量的使用,初值为1
    Semaphore read;      //互斥对文件的读与写,初值为0
    Semaphore write;     //互斥对文件的写与写,初值为1
    Semaphore mutexR;    //用于第一个等待的读者释放后续等待的读者,初值为1


    任一读者:
    void Reader_i() {
        P(mutexR);
        P(mutexWC);
        if(writeCnt>0) {    //检查是否有写者等待
            V(mutexWC);
            P(read);        //写者优先有则等待
        }//end if
        else
            V(mutexWC);
        V(mutexR);
        P(mutexRC);
        readCnt=readCnt+1;
        if(readCnt==1)      //第一个读者开始读
            P(write);       //阻止后来的写者
        V(mutexRC);
        读文件;
        P(mutexRC);
        readCnt=readCnt-1;
        if(readCnt==0)      //最后一个读者读完
            V(write);       //唤醒等待的写者
        V(mutexRC);
    }//end Reader

    任一写者:
    void Writer_i() {
        P(mutexWC);
        writeCnt=writeCnt+1;
        V(mutexWC);
        P(write);
        写文件;
        V(write);
        P(mutexWC);
        writeCnt=writeCnt-1;
        if(writeCnt==0)    //无写者等待或正在写
            V(read);       //才唤醒读者
        V(mutexWC);
    }//end Writer

    [此贴子已经被作者于2007-12-21 10:36:42编辑过]
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/12/20 23:05:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 计算机考研交流 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 8:18:06

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

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