使用信号量解决读者写者问题--写者优先

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013797304/article/details/51481267

//写者优先
int readcount=0 , writecount=0;
semaphore x = 1, y = 1, z = 1, wsem = 1 , rsem = 1;
void reader()
{
    while(true){
        semWait(z);//z信号用来保证阻塞在rsem信号中排队的读者至多只有一个。其余的阻塞在z上。
            semWait(rsem);
                semWait(x);//保证下面3句操作的原子性
                    readcount ++;
                    if(readcount == i)
                        semWait(wsem);
                semSignal(x);
            semSignal(rsem);//写者抢占访问权的时机!
        semSignal(z);

        READUNIT();

        semWait(x);
            readcount --;
            if(readcount == 0)
                semSignal(wsem);
        semSignal(x);       
    }
}

void writer()
{
    while(true){
        semWait(y);
            writecount ++;
            if(writecount == 1)
                semWait(rsem);
        semSignal(y);

        semWait(wsem);
            WRITEUNIT();
        semSignal(wsem);

        semWait(y);
            writecount --;
            if(writecount == 0)
                semSignal(rsem);
        semSignal(y);
    }
}</pre>
  • 信号量rsem:当至少有一个写进程准备访问数据区时,用于禁止所有的读进程.

  • 变量writecount:控制rsem的设置.

  • 信号量y:控制writecount的更新.

过程分析:

1:对于写进程P,如果P是第一个写进程,那么semWait(rsem),如果 rsem=1,即没有读进程,则后续读进程会阻塞rsem上,直到所有的写进程都写完.,if(writecount == 0)semSignal(rsem);读进程才可以读.注意,写文件时wsem仍然保持着互斥,每次只有一个写进程可以写.

如果此时有读进程在读,转2.

2:对于读进程P,如果有写进程,则读进程会被阻塞在rsem上.

如果没有写进程在写,那么第一个写进程if(writecount == 1)semWait(rsem),被阻塞在rsem上,后边的写进程被阻塞在y上semWait(y);.
使得写进程只有等到P执行完后if(readcount == 0) semSignal(wsem);才可以执行,转1.

综上所述:
由于在有多个读进程在读,又有写进程要写时,写进程可以抢占机会进行写.而当多个写进程时,只有所有写进程运行完,读进程才可以读.所以是

写优先

展开阅读全文

没有更多推荐了,返回首页