问答题 下面是两个并发执行的进程。它们能正确执行吗?若不能,试举例说明,并修改之。
Cobegin
Var x: integer;
Process P1
Var y, z:integer;
Begin
x:=1;
y"=0;
If X>=1 then y:=y+1;
z:=y;
End
Process P2
Var t, u:integer;
Begin
x:=0;
t:=0;
If x<1 then t:=t+2;
u:=t;
End
Coend

【正确答案】P1和P2是两个并发进程,它们不能正确执行,可能导致结果的不确定性,如:
进程P1 进程P2
(1)x:=1 (a)x:=0
(2)y:=0 (b)t:=0
(3)if x>=1 then y:=y+1 (c)if x<1 then t:=t+2
(4)z:=y (d)u:=t
如果P1和P2按顺序执行,即(1)(4)(a)(d),则结果为:
y=1,z=1,t=2,u=2
如果执行顺序是:(1)(2)(a)(b)(3)(4)(c)(d),则结果为:
y=0,z=0,t=2,u=2
结果不确定性的原因在于使用了公共变量,要求P1和P2必须互斥执行,对程序修改如下:
Cobegin
Var x:integer; s:semaphore;
s:=1
Process P1
Var y, z:integer;
Begin
p(s);
x:=1;
y:=0;
if x>=1 then y:=y+1;
v(s);
z:=y;
End
Process P2
Var t, u:integer;
Begin
p(s);
x:=0;
t:=0;
if x<1 then t:=t+2;
v(s);
u:=t;
End
Coend
【答案解析】