我有这个例子,我试图看看这些语句的运行顺序。我相信它会是,X,A,B,Y。
我这样说是对的吗?我的逻辑是语句X首先与A并行运行,但是当我们到达信号量时,它仍然是0,因此我们允许语句B由于信号而运行,因为这会增加值。现在我们终于可以运行Y?
答案 0 :(得分:2)
因为进程并行运行,所以无法确定X和A的顺序 - 我们可以将其表示为(X | A) - 意味着执行其中任何一个。
现在,对于信号量:由于进程是并行的,动作的顺序是(wait(consyn)| signal(consyn),其中有不同的结果
如果先执行wait(consyn)并在此之后执行signal(consyn),则生成的场景为(X | A)(Y | B),P1和P2结束。如果顺序颠倒并且信号量实现使用signal增加它的值并等待递减,则结果再次是(X | A)(Y | B),P1和P2结束。
此外,线程执行的顺序不必完全平行,因此结果可以是(X,Y),(A,B)和(A,Y)的顺序 - 保证信号量保存。
答案 1 :(得分:2)
关于陈述的顺序,你几乎没有什么可说的。你有订单X / wait / Y.你有订单A / signal / B.你有订单信号/ Y.这就是全部。如果你对等待/信号不感兴趣只是工具,那么Y在A之后执行,这就是你所知道的。
P2可以在执行P1的第一个语句之前完全运行到它的结尾。