读者写者问题

读者写者问题的小总结。。。实际上就是抄书
写者优先的情况

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

    }
}

读进程优先的情况

int readcount = 0;
semaphore wsem = 1, x = 1;
void reader()
{
    while(true)
    {
        wait(x);//x就是锁readcount的
        readcount++;
        if(readcount == 1) //第一个读进程把写进程的进入方式堵死
            wait(wsem);
        signal(x);
        READ();
        wait(x);
        readcount--;
        if(readcount == 0)
            signal(wsem);//最后一个读进程把写进程的进入方式放开
        signal(x);        
    }
}
void writer()
{
    while(true)
    {
        wait(wsem);   //看看能不能进
        WRITE();
        signal(wsem);
    }
}

二者公平竞争的情况

void reader()
{
    while(true)
    {
        wait(rwsem);//让读写者都去抢rwsem
        wait(x);
        readcount++;
        if(readcount == 1) //第一个读进程把写进程的进入方式堵死
            wait(wsem);
        signal(x);
        READ();
        wait(x);
        readcount--;
        if(readcount == 0)
            signal(wsem);//最后一个读进程把写进程的进入方式放开
        signal(x);              
        signal(rwsem);
    }
}
void writer()
{
    while(true)
    {
        wait(rwsem);
        wait(wsem);   //看看能不能进
        WRITE();
        signal(wsem);
        signal(rwsem);
    }
}

你可能感兴趣的:(读者写者问题)