信号量输出以下内容

时间:2013-06-20 22:50:20

标签: semaphore

我想逐步了解这个程序的输出。  最初,值为:S1 = 0,S2 = 1,S3 = 0,a = 1.输入代码

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);

1 个答案:

答案 0 :(得分: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。

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

因此印刷值 4,10,22,46 ......