读者写者问题描述如下:
1.同一时刻允许多个进程读
2.只要有进程在写读进程就应该阻塞
3.只要有进程在写写进程就应该阻塞
所以利用记录型信号量代码如下:
var rmutex,wmutex:semaphore :=1,1
readcount:integer :=0;
Reader:begin
repeat
wait(rmutex);
if(readcount==0) wait(wmutex);//当没有进程读时看是否有写进程
readcount :=readcount+1;
signal(rmutex);
readwords.....
wait(rmutex);
readcount :=readcount-1;
if(readcount==0) sigal(wmutex);//没有进程读时,可让进程去写.这句仅仅是最后一个读
完的进程所执行的语句。
signal(rmutex);
until false;
end
Writer:
begin
repeat
wait(wmutex);
writewords;
signal(wmutex);
until false
end
用 AND型信号量解决如下:
var R,wmutex:semaphore :=1,1
Reader:begin
repeat
wait(R,1,1);//和记录型信号量一样
wait(wmutex,1,0);//起开关作用,只要wmutex>=1,Reader就可以读。wmutex=0就不能读
readwords.....
signal(R,1);//和记录型信号量一样
until false;
end
Writer:
begin
repeat
wait(wmutex,1,1;R,RN,0);//既无写进程写时&&R>=RN即没有读进程读时
writewords;
signal(wmutex,1);//和记录型信号量一样
until false
end