2016-03-01 102 views
0

我最近在測試中遇到了一個問題,基本上說這是爲了讓3個併發進程按順序執行一些代碼塊。競賽狀況在哪裏?


執行順序櫃面說沒有道理的例子:

P1 P2 P3 P1 P2 P3 ...

我的回答,我寫這個僞ISH代碼

shared s[2] = {-1,-1}; 
void Process1(){ 
    while(1){ 
     if(s[0] < 0 && s[1] < 0){ 
     DO_CS; 
     s[0] = 1; 
     } 
    } 
} 

void Process2(){ 
    while(1){ 
     if(s[0] > 0 && s[1] < 0){ 
     DO_CS; 
     s[1] = 1; 
     } 
    } 
} 

void Process3(){ 
    int i = 0; 
    while(1){ 
     if(s[1] > 0 && s[0] > 0){ 
     DO_CS; 
     s[0] = -1; 
     s[1] = -1; 
     } 
    } 
} 

我的老師w死記硬背的競爭條件,並在Process3的if語句中圈出最後一行,並在process2中繪製了條件語句的箭頭。

我很難看到這可能會導致競爭條件。我相信這很明顯,但我無法看到它。

謝謝!

+0

你現在明白了嗎? – Amit

+0

是的,你的答案是有道理的。我忘記了,如果陳述不是一次全部評估。非常感謝您,我會將您的答案標記爲已接受。 @Amit – Danwakeem

回答

1

考慮事件的順序如下:

  1. 一段時間後,S = [1,1]。
  2. Process2之內,該線程正在評估if語句中的表達式,並且剛剛通過了真實條件s[0] > 0並且即將繼續。
  3. Process3,修改s是[-1,-1]。
  4. Process2評估表達式的其餘部分並在Process1之前執行。