我想知道這個程序的輸出,請一步一步來。 最初,這些值是: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);
我想知道這個程序的輸出,請一步一步來。 最初,這些值是: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);
已鏈接的溶液代碼是正確的。 用非正式術語表示: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 ...
我們不是做你的功課。如果我們想要,我們也不可以,因爲你沒有定義P和V是什麼。這和信號量有什麼關係? –
我同意加布它真的看起來像功課。如果不是,你應該編輯你的問題。 – jods
@GabeSechan P和V是經典文獻中「進入」和「退出」信號量函數的名稱。 – jods