问答题
下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并对其改正。
parbegin
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;
endparend
【正确答案】上述两个并发执行的进程共享整型变量x,且共享时没能做到互斥,因此它们的执行结果具有不确定性。若先执行P1,并在它执行完语句x:=1后进行进程调度,执行P2,并在P2结束后再调度执行P1,则最后结果是x=y=z=0,t=u=2。若先执行P1,并在它执行完if语句后再调度P2执行,则最后结果是x=0,y=z=1,t=u=2。
可将上述程序改正为(本题按照原题的pascal语法书写):
Parbegin
var x:interger;
s:semaphore:=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;
endparend