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);
    
        }
    }
  • 相关阅读:
    主动找智能钥匙 PKE取代RKE是大势所趋
    OBD-II Protocol -- SAE J1850 VPW PWM
    STM32F4: GENERATING A SINE WAVE
    Using PWM Output as a Digital-to-Analog Converter
    Spartan-6
    MAX II Device Compatibility with 5.0-V CMOS Devices
    ARM FPGA Extended Memory Interface
    STM32 100 pin 多个外设译码方案
    SILICA Xynergy-M4 Board -- STM32F417 meets XILINX Spartan-6
    Xilinx Platform Usb Cable
  • 原文地址:https://www.cnblogs.com/HackHer/p/7011294.html
Copyright © 2011-2022 走看看