2013-06-20 40 views
-4

我想知道這個程序的輸出,請一步一步來。 最初,這些值是: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

我們不是做你的功課。如果我們想要,我們也不可以,因爲你沒有定義P和V是什麼。這和信號量有什麼關係? –

+0

我同意加布它真的看起來像功課。如果不是,你應該編輯你的問題。 – jods

+0

@GabeSechan P和V是經典文獻中「進入」和「退出」信號量函數的名稱。 – jods

回答

0

已鏈接的溶液代碼是正確的。 用非正式術語表示:P信號量== 0或信號量遞減並繼續; V增加信號量。

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

p2是唯一可以運行的。它增加一個(== 2)並增加S1和S3。它不能繼續,因爲S2現在是0.

p3只能做一步,因爲在第一次P調用之後,再次S3 == 0。

p1是唯一可以工作的過程。它加倍(== 4),然後取消阻止S3。它不能繼續,因爲S2再次爲0。

現在p3是唯一可以運行的。它打印。然後取消阻止p2。

注意情況與問題開始時的情況完全相同(現在除了== 4)。所以每個循環的運行方式完全相同:p2增加a,p1使a增加一倍,p3增加a。重複。

因此打印的值是4,10,22,46 ...

+0

我不明白p3是如何進入printf區域的,因爲那裏總是有2個P(S3),不應該一遍又一遍地被阻塞? – sdafad

+0

有兩個P(S3),所以它需要兩個V(S3)進入(首先給定S3 == 0)。它在p2結束時獲得一個V,在p1結束時獲得第二個V. – jods

+0

「p1是唯一可以工作的過程,它會使(== 4)加倍,然後解除對S3的阻止,因爲S2再次爲0,所以無法繼續。這裏不是S3 = 1嗎? – sdafad