begin
P(mutex); //创造段,使以下操作不被打断
readcount:=readcount+1; //等待阅读者加一
if readcount=1 then
P(wrt); //标志第一位阅读者,获取写入资源,禁止写入V(mutex);
读数据集;
P(mutex);
readcount:=readcount-1; //等待阅读者减一
if readcount=0 then
V(wrt); //释放写入资源
V(mutex);
End
Writeri:
begin
P(wrt);
写数据集;
V(wrt);
end;
coend
2、代码分析:
源程序很好地管理了并行和互斥,利用P/V操作使得过程不被打断(互斥),使用cobegin/coend实现并行。但在实际生活中,写入者(通常是管理员)应具有更高权限,设计程序通常应该是写入者优先。
四、思考题
1、程序中使用到了互斥变量和临界资源来实现互斥,这两者在实现机制上有不同吗,若有,是什么不同?
答:互斥变量属于信号量,其值只可以为0或1,主要用于进程间的互斥应用情况,也即“非此即彼”的状况,而临界资源(共享变量)的值可以是整形变量,主要用于进程间相互合作的同步应用情况,其值大于零时表示可用资源数,其值小于零时表示在该信号量上等待的进程数。
2、考虑演示程序是怎样实现在随机调度进程时间、控制进程延迟时间、关闭进程时间的,找出相关函数,变量,并说明。
答:程序是通过运用函数Sleep(P_DELAY)来实现对进程调度、延迟、关闭时间的控制的,其中变量P_DELAY的值为rand()/25*10,其会产生0到1/25*10之间的一个随机数作为随机时间。
五、实验总结
这次实验是对C语言程序阅读能力的进一步检测,因为已经在课堂以及书本上了解了此程序的算法原理,再加上第一次对代码形式有所了解,这一次学习较为轻松。这里使用的是阅读者优先算法,同时也会有写入者优先算法,而以后在写设计算法的过程中,需要全方面考虑,使阅读者或写入者优先算法交替使用,从而获得最好效果。