2012-11-12 66 views
0

在共享存儲器中這兩個線程同時運行(所有變量都是 兩個線程之間共享):
線程A線程在單處理器系統

for (i=0; i<5; i++) { 
    x = x + 1; 
} 

線程B

for (j=0; j<5; j++) { 
    x = x + 2; 
} 

假定一個單處理器系統
a-給出一個簡潔的pro當兩個線程都完成時爲什麼x≤15。
b-假設我們用x = x-1代替線程B中的x = x + 2什麼將是X的值。

我不明白這個問題,我谷歌它,我找到答案,但我可以不明白 我想爲它解釋一下。

+0

Stackoverflow往往是相當開放的關於幫助人們做家庭作業,但請標記爲這樣。 – gbtimmon

+1

@gbtimmon - 實際上,[作業]標籤現在已經過時。 – ArjunShankar

+3

@ gbtimmon家庭作業標記已被棄用,不會被使用。 – Joe

回答

4

如果線程正常工作,最高值「x」可以是15.這一切都取決於操作系統的調度程序。

請注意,我假設x的初始值爲0! 可以說,線程A和線程B是序列化的。 x的線程A後的數值是完整會5.

i | x 
------- 
0 | 1 
1 | 2 
2 | 3 
3 | 4 
4 | 5 

X進入線程B的值將是5,結果x是15

i | x 
------- 
0 | 7 
1 | 9 
2 | 11 
3 | 13 
4 | 15 

最終值現在,事情通常不會以這種方式發生,並且線程將讀取x的初始值並進行相加,然後將其修改後的值寫回到內存中。以下情況可能發生。

Thread A reads the value 'x' as 0 
Thread B reads the value 'x' as 0 
Thread A adds 1 to x making its local copy of x, 1 
Thread B adds 2 to x making its local copy of x, 2 
Thread A writes its modified value of x as 1 
Thread B writes its modified value of x as 2 (overwriting Thread A's modification) 

因此,x不會超過15,但取決於調度程序,會更少!

+0

這通常被稱爲'競賽條件'見更多http://en.wikipedia.org/wiki/Race_condition – gbtimmon

+0

謝謝你我感謝你 – Suzana

+0

+1爲好解釋。 – Ayse

2

一個) 指令x=x+1不處於低電平單指令和它由讀出的x的序列,再加入1至x,然後更新X的存儲器。因此,可能發生兩個線程讀取相同的x值。

假設,如果兩個線程讀變量x的值相同,然後更新x和寫回至x這個原因X < 15.

B) 對於x的相同的原因值可以是0之間5如果你的指令是x=x-1


試試這個,你將學到更多!
-S option編譯你的c代碼,它會爲你的程序創建一個編譯好的彙編代碼。那麼你可以understand x = x + 1 is not a single instruction。並且在完成x = x + 1指令之前可以在線程之間切換,因此它不是原子的。