讀者寫者問題的小總結(jié)祈惶。势决。。實際上就是抄書
寫者優(yōu)先的情況
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上翻翩,這使得都许,當(dāng)一個reader獲得了rsem在它處于critical section時,若此時來了一個writer嫂冻,這個writer只需要等待這一個reader結(jié)束然后可以搶占胶征,若沒有z,該writer可能要與多個reader搶占訪問權(quán)
wait(rsem); // rsem writer能夠搶占reader的訪問權(quán)
wait(x); // x 只用來確保readerCount的原子性操作
readerCount++;
if(readerCount == 1)
wait(wsem);// 在有讀者在critical section中讀時桨仿,防止此時有writer要修改critical section中的數(shù)據(jù)
signal(x);
signal(rsem);
signal(z);
READ();
wait(x);
readerCount--;
if(readerCount == 0)
signal(wsem); // readerCount是此時critical section中的reader的數(shù)量睛低,要保證critical section中的所有的reader全部讀完離開之后,才能允許writer進入寫數(shù)據(jù)
signal(x);
}
}
//writer
void writer()
{
while(true){
wait(y);// y用來保證writerCount 的原子性操作
writerCount++;
if(writerCount == 1)
wait(rsem); // 防止此時reader進入讀數(shù)據(jù)
signal(y);
wait(wsem); // 此時只要搶占讀者的或上一個寫者的訪問權(quán)
WRITE();
signal(wsem);
wait(y);
writerCount--;
if(writerCount == 0)
signal(rsem); // 只有所有寫者全部寫完服傍,才允許讀者進行讀
signal(y);
}
}
讀進程優(yōu)先的情況
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);
}
}