下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明 并改正之。 parbegin va
下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之。 parbegin var x:integer; process P1 process P2 var y,z:integer var t,u:integer begin begin x:=1; x:=0; y:=0; t:=0; if x>=1 then y:=y+1; ifx<=1 then t:=t+2 z:=y; u:=; end end parend
请帮忙给出正确答案和分析,谢谢!
-
正确答案:P1和P2两个并发进程的执行结果是不确定的所以不能正确运行。例如: 若先执行完P1再执行P2结果是:x=0y=1z=1t=2u=2。 若先执行P1到x:=1;然后一个中断去执行完P2再一个中断回来执行完P1结果是:x=0y=0z=0t=2u=2。 显然两次执行结果不同所以这两个并发进程不能正确运行。 可以将这个程序改为: parbegin var x:integer; var s:semaphore:=1: process P1 process P2 var yz:integer var tu:integer begin begin P(s); P(s); x:=1; x:=0; y:=0; t:=0; if x>=1 then y:=y+1; if x<=1 then t:=t+2 V(s); V(s); z:=y; u:=t; end end parend
P1和P2两个并发进程的执行结果是不确定的,所以不能正确运行。例如:若先执行完P1再执行P2,结果是:x=0,y=1,z=1,t=2,u=2。若先执行P1到x:=1;然后一个中断去执行完P2,再一个中断回来执行完P1,结果是:x=0,y=0,z=0,t=2,u=2。显然两次执行结果不同,所以这两个并发进程不能正确运行。可以将这个程序改为:parbeginvarx:integer;vars:semaphore:=1:processP1processP2vary,z:integervart,u:integerbeginbeginP(s);P(s);x:=1;x:=0;y:=0;t:=0;ifx>=1theny:=y+1;ifx<=1thent:=t+2V(s);V(s);z:=y;u:=t;endendparend
