读者优先:
int readcount = 0;
semaphore mutex = 1, wrt = 1;
Reader :
while(true){
wait(mutex);
readcount++;
if(readcount == 1)
wait(wrt);
signal(mutex);
...
reading is performed
...
wait(mutex);
readcount--;
if(readcount == 0)
signal(wrt);
signal(mutex);
}
Writer:
while(true){
wait(wrt);
...
writing is performed;
...
signal(wrt);
}
写者优先:
int readCount = 0, writeCount = 0;
semaphore fileSrc = 1, read =1, readCountSignal = 1, writeCountSignal = 1;
Reader:
while(true){
wait(read); //申请令牌
wait(readCountSignal);
if(readCount == 0)
wait(fileSrc);
readCount++;
signal(readCountSignal);
signal(read); //释放令牌
...
perform read operation
...
wait(readCountSignal);
readCount--;
if(readCount == 0)
signal(fileSrc);
signal(readCountSignal);
}
writer:
while(true){
wait(writeCountSignal);
if(writeCount == 0)
wait(read);
writeCount++;
signal(writeCountSignal);
wait(fileSrc);
...
perform write operation
...
signal(fileSrc);
wait(writeCountSignal);
writeCount--;
if(writeCount == 0)
signal(read);
signal(writeCountSignal);
}
读写公平:
1.优先级相同。
2.写者、读者互斥访问。
3.只能有一个写者访问临界区。
4.可以有多个读者同时访问临界资源。
int readCount = 0;
semaphore mutex = 1, rw = 1, w = 1;
Reader:
while(true){
wait(w);
wait(mutex);
if(readCount == 0)
wait(rw);
readCount++;
signal(mutex);
signal(w);
...
perform read operation
...
wait(mutex);
readCount--;
if(readCount == 0)
signal(rw);
signal(mutex);
}
Writer:
while(true){
wait(w);
wait(rw);
...
perform write operation
...
signal(rw);
signal(w);
}