zoukankan      html  css  js  c++  java
  • 操作系统-进程同步经典问题-读者写者-写者优先

    啧。这几个月在肝GPA,没有好好研究代码,最近期末重新看操作系统,觉得这个问题非常有趣。

    题目不用说了。

    前提:

      可以允许多个读者读,但是只有一个写者写。

      写者优先:在有读者读的时候,除非读者是在临界区内正在读,否则在任何剩余时间写者都应该能够抢夺读者。

           而要尽量保证写者写的时候,读者不能抢夺写者的访问权。

    int readerCount = 0, writerCount = 0;
    semaphore x(1),y(1),z(1),rsem(1),wsem(1);
    
    //reader
    void reader()
    {
        while(true){
            wait(z);// z 保证在writer处于critical section时,只有一个reader被堵在了rsem上,其余的reader被堵在了z上,这使得,当一个reader获得了rsem在它处于critical section时,若此时来了一个writer,这个writer只需要等待这一个reader结束然后可以抢占,若没有z,该writer可能要与多个reader抢占访问权
                wait(rsem); // rsem writer能够抢占reader的访问权
                    wait(x); // x 只用来确保readerCount的原子性操作
                        readerCount++;
                        if(readerCount == 1)
                            wait(wsem);// 在有读者在critical section中读时,防止此时有writer要修改critical section中的数据
                    signal(x);
                signal(rsem);
            signal(z);
    
            READ();
    
            wait(x);
                readerCount--;
                if(readerCount == 0)
                    signal(wsem);  // readerCount是此时critical section中的reader的数量,要保证critical section中的所有的reader全部读完离开之后,才能允许writer进入写数据
            signal(x);
        }
    }
    
    //writer
    void writer()
    {
        while(true){
            wait(y);// y用来保证writerCount 的原子性操作
                writerCount++;
                if(writerCount == 1)
                    wait(rsem); // 防止此时reader进入读数据
            signal(y);
    
            wait(wsem); // 此时只要抢占读者的或上一个写者的访问权
                WRITE();
            signal(wsem);
    
            wait(y);
                writerCount--;
                if(writerCount == 0)
                    signal(rsem);      // 只有所有写者全部写完,才允许读者进行读
            signal(y);
    
        }
    }
  • 相关阅读:
    Asp.net HttpContext 简介
    cxf 调用 .net webservice
    Dapper.Rainbow 简单使用
    Aspose.words 书签定位
    修改WCF的默认序列化格式
    mysql8.0.18忘记密码后重置密码
    聊一聊c#中的MATH.ROUND方法
    Windows上安装MySql
    win7搭建本地SonarQube环境进行c#代码分析
    使用dapper遇到的问题及解决方法
  • 原文地址:https://www.cnblogs.com/HackHer/p/7011294.html
Copyright © 2011-2022 走看看