公平竞争,即先来的先执行,关键在于利用k信号量来实现“钥匙”作用,读写者进程会加入到k队列,当没有写者时,reader进程可以累加readcout;当有写者到来时,会使readcout停止增加,写者获得k钥匙,读者readcount消耗完时,读者解除占用rw资源,写者开始写,写完之后交出k钥匙,之后唤醒下一个读或写进程。k队列实现了使读写者进程按时间来加入队,实现了先来者先执行。
Readcout 用来记录读者进程的数量,
利用mutex来控制临界资源readcount,rw来控制读写之间的互斥,k用做钥匙。
伪代码如下:
int readcount=0;
semaphore mutex=1, rw=1 k=1;
reader( ):
wait (k);
wait (mutex);
if (readcount == 0)
wait(rw);
readcount++;
signal (mutex);
signal (k);
……………
reading………
……………
wait (mutex);
readcount--;
if (readcount == 0)
signal (rw);
signal (mutex);
writer( ):
wait(k);
wait(rw);
……………
writing……………
……………
signal(rw);
signal(k);