2010-05-09 156 views
12

是否具有2個不同的線程:從C#陣列(例如,從第一位置)
線程安全

  • 一個讀數,
  • ,另一個寫入到相同的C#陣列,但至不同的位置(例如到最後一個位置)

線程安全嗎?
(我的意思是這裏沒有鎖定讀取或寫入)

回答

8

這個特殊情況是安全的,是的。

讀取和寫入數組的不同部分不會干擾其他操作。

但是,根據元素的類型和元素的大小,讀取和寫入相同的位置會給您帶來問題。

+1

只要這些項目在單獨的CPU字詞 – Stewart 2010-05-09 19:55:56

+0

+1從來沒有想過這是線程安全的,但我明白它爲什麼。謝謝! – 2010-05-09 19:57:29

+0

考慮使用無鎖算法時,認爲「同一位置」與CPU(多個)所認爲的位置不同,這一點很重要。內存的CPU視圖與C這樣的視圖語言完全不同,它給了我們字節佔用地址的地方。在某些數據類型的某些CPU架構(特別是ARM,Power)上,即使這可能不安全 – Stewart 2010-05-09 22:59:57

5

長話短說:是的。只要它到兩個不同的地點,它就是一個安全的操作。

前段時間有一個discussion about this,如果您好奇,它有一些有用的信息。

+0

+1從來沒有想過這是線程安全的,但我明白它是爲什麼。謝謝! – 2010-05-09 19:56:36

7

我不確定這是保證安全。想象一下你有byte []。這些字節在內存中緊密排列。現在,如果您修改這些字節,編譯器可能會合並一些寫入來執行字(32位)大小的讀取修改寫入操作。在一些CPU上,例如ARM,這是編譯器唯一的內存修改指令。如果您一次修改多個字節,這非常方便。 CPU也可以做同樣的事情。它也可以在你不知道它的情況下重新排序。面對這種優化,讀取相鄰存儲器的線程可能會看到部分修改。你不會看到這種效果,因爲堆分配器對你很好,並且總是給你至少是字對齊的內存。

+1

+1:在我看來這是最好的答案。總是最好懷疑無鎖的穿線習語。我可以想到各種內存障礙問題,即使線程在不同的陣列位置上工作也可能導致問題。只是在問題中提供的信息不足以給出明確的答案。 – 2010-05-09 20:57:11