2012-01-19 68 views
0

我搜索了一下,但找不到任何有用的東西。有人可以幫我解決這個併發/同步問題嗎?並行/異步訪問共享數據

下面給出異步運行的程序的5個實例,與s是與的0i局部變量的初始值的共享數據,其值是由獲得s

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

我想知道哪些值,以及究竟爲什麼。

回答

1

沒有回答的答案是:Uaaaagh,不要做這樣的事情。

在你的問題意義上的答案更多的是:原則上,任何值是可能的,因爲它是完全未定義的。您沒有嚴格保證併發寫入是以任何方式原子化的,並且不會導致完全垃圾。
實際上,處理器的字數小於的原子是(至少我知道的),但它們沒有明確的順序。此外,您通常不知道線程/進程的排定順序。所以你永遠不會看到「隨機垃圾」的價值,但你也不知道它會是什麼。它將是5或更高(最高25)的任何東西。

由於沒有使用原子增量,所以在讀取值,遞增和寫回之間存在競爭。如果在結果寫回之前該值正在被另一個實例寫入,則之前完成的寫入(因此增量)不起作用。如果沒有發生,這兩個增量都是有效的。儘管如此,除了理論上的「總垃圾」可能性之外,每個實例的值至少增加5次,所以不可能小於5的值會導致結束。因此(1)和(2)是不可能的,但是(3)是。

+0

感謝您的麻煩。我知道這是一個可怕的想法。這只是一個考試問題,我不能確定我是對的。我自己的概念和你的一樣。兩個天才不能錯,對吧? ;-) –