-4

我想知道这个程序的输出,请一步一步来。最初,值为: S1=0 , S2=1 , S3=0, a=1.enter code here

p1                  p2                  p3
while(1) {       while(1){             while(1){  
P(S1)            P(S2);               P(S3);
a=2*a;         a=a+1;               P(S3);
V(S3) }        V(S1);               printf("%d\n",a);
                   V(S3) }              V(S2);
4

1 回答 1

0

您链接的解决方案是正确的。用非正式的术语来说:P 在信号量 == 0 时阻塞或递减信号量并继续;V 增加信号量。

起初 S1 和 S3 == 0,所以 p1 和 p3 被阻塞。

p2 是唯一可以运行的。它增加 a (== 2) 并增加 S1 和 S3。它无法继续,因为 S2 现在为 0。

p3 只能做一步,因为在第一次 P 调用之后,S3 == 0 再次。

p1 是唯一可以工作的进程。它将 a (== 4) 加倍,然后解除 S3 的阻塞。它无法继续,因为 S2 再次为 0。

现在 p3 是唯一可以运行的。它打印4。然后解锁 p2。

请注意,情况与问题开始时完全相同(现在 a == 4 除外)。所以每个循环都以完全相同的方式运行:p2 递增 a,p1 将 a 加倍,p3 打印 a。重复。

因此打印值为4, 10, 22, 46...

于 2013-06-20T23:11:44.617 回答