以下構造是線程安全的,假設foo的元素已對齊並且大小正確,從而不會出現字詞撕裂?如果不是,爲什麼不呢?將變量同時更新爲同一值的線程安全
注意:下面的代碼是我想要做的玩具例子,而不是我真實的現實情景。顯然,在我的例子中,有更好的方式來編碼可觀察行爲。
uint[] foo;
// Fill foo with data.
// In thread one:
for(uint i = 0; i < foo.length; i++) {
if(foo[i] < SOME_NUMBER) {
foo[i] = MAGIC_VAL;
}
}
// In thread two:
for(uint i = 0; i < foo.length; i++) {
if(foo[i] < SOME_OTHER_NUMBER) {
foo[i] = MAGIC_VAL;
}
}
這顯然乍看上去不安全,所以我還是要強調,爲什麼我認爲這可能是安全的:
- 只有兩個選項是FOO的元素將保持不變或將設置爲MAGIC_VAL。
- 如果線程2在更新中看到foo [i]處於中間狀態,則只會發生兩件事:中間狀態爲<
SOME_OTHER_NUMBER
或不是。如果它是<SOME_OTHER_NUMBER
,則線程2也會嘗試將其設置爲MAGIC_VAL。如果不是,線程2將不會執行任何操作。
編輯:另外,如果foo是一個長或雙或什麼,以便更新它不能做原子?你可能仍然認爲對齊等是更新foo的一個元素不會影響任何其他元素的。此外,在這種情況下,多線程的全部重點都是性能,所以任何類型的鎖定都會打敗它。
是的,對於這樣一個簡單的for循環來說,在兩個線程中執行它可能比僅僅執行一個循環慢,因爲它們共享數據並且(尤其是不好的)寫入它。負面可擴展性的萬歲! – 2009-01-15 22:38:13