操作系统-进程同步经典问题-读者写者-写者优先

啧。这几个月在肝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);

    }
}

 

posted @ 2017-06-14 22:19  ShellHan  阅读(6361)  评论(1编辑  收藏  举报