设计读者--写者问题的写者优先算法;

学习Windows平台下信号量的API函数的使用;
编制读写进程的模拟信息文件,里面包含多个读写进程的运行描述:如0秒到达读进程1,读5秒结束;1秒到达写进程2,写3秒结束;2秒到达读进程3,读4秒结束。可以写为:
0:1,r,5;
1:2,w,3;
2:3,r,4;
编制读者--写者问题的写者优先算法,从进程模拟信息文件中取出进程信息,按要求启动对应的进程模拟程序,决定出读者/写者进程的运行次序。
测试:针对进程模拟信息文件里面的数据为正常、缺项、格式不正确等各种情况,检测程序的执行结果

http://blog.csdn.net/zoudaokou2006/article/details/3966694

Var Mut1,Mut2,Wmutex,Fmutex:Semaphore;

Rcount,Wcount:integer;

Mut1:=Mut2:=WMutex:=Fmutex:=1;

Rcount:=Wcount:=0;

//Fmutex --> 读者写者互斥

//WMutex --> 写者互斥

//Mut1 --> access to Rcount && 竞争Fmutex

//Mut2 --> access to Wcount

Writer:begin

Wait(Mut1);

Wcount:=Wcount+1;

If Wcount=1 then Wait(Fmutex); //如有读者,写者阻塞在此处

Signal(Mut1);

Wait(WMutex);

写操作;

Signal(Wmutex);

Wait(Mut1);

Wcount:=Wcount-1;

If Wcount=0 then Signal(Fmutex);

Signal(Mut1);

end

Reader:begin

Wait(Mut1); //读者需要先申请Mut1,如果有写者在等待Fmutex,则读者被阻塞,写者优先

Signal(Mut1); //立即释放Mut1,使写者可以随时申请到Mut1

Wait(Mut2);

Rcount:=Rcount+1;

If Rcount=1 then Wait(Fmutex); //第一个读者进入时,申请Fmutex;如有写者,第一个读者会阻塞在此处

Signal(Mut2);

读操作;

Wait(Mut2);

Rcount:=Rcount-1;

If Rcount=0 then Signal(Fmutex); //最后一个读者退出时,释放Fmutex

Singal(Mut2);

end