2013-06-22 122 views
0

我有下面的代码,我想知道printf打印:
我做到了,但我不知道我的回答。信号量p3永久封锁?

变量:d = 0,A = 1,B = 1,C = 0。

p1    p2     p3 
while(1) {  while(1){   while(1){ 
    P(A); P(B);  P(A); P(B);   P(C); P(C); 
    d = 2*d;   d = d+1;   printf("%d\n",d); 
    V(C)    V(C);    V(A); V(B); 
}    }     } 

我的尝试是:

C=0, p3被阻塞 开始形式过程

p1 A=0, B=0 and d=0 and C=1. 
p2 blocks because A=0 and B=0, p3 

它还块在第二P(C)A=0, B=0, C=0发生死锁,并且printf不会打印任何内容。它是否正确?

+0

对于我们这些没有精神或班上的人,P(X)和V(X)是做什么的? – Dukeling

+0

@Dukeling,'P'传统上是'down'/'wait','V'是'up' /'signal'。 – zch

+0

对不起,P(X)下降,V(X)上升 – sdafad

回答

0

你是对的 - 死锁 - 没有打印。

处于死锁状态:p3正在等待第二个P(C)。 p1或p2完成了第一次迭代,另一次 - 零迭代。 p1和p2都在P(A)处等待。 d的值取决于p1和p2之间的种族 - 进入第一次迭代。