我想逐步了解这个程序的输出。 最初,值为: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);
答案 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 ......