2017-06-20 70 views
1

可以說我們有一個兩個元素的數組,它們是一些原始值的類型。在多線程環境下讀寫數組

volatile int[] a = new int[2]{0,0}; 

我有兩個線程,每個線程寫入/讀取其中一個元素。 第一個線程工作只有與[0]和第二個線程工作只有與[1]。

即使不同的索引值受到影響,數組是否可以這樣工作,或者數組仍然要求爲鎖定,即使不同的索引值受到影響?

+1

這將有助於 - https://stackoverflow.com/questions/1460634/are-c-sharp-arrays-thread-安全 – kiziu

回答

3

線程不需要在未被任何其他線程使用的內存位置上發出鎖定。所以在你的情況下,lock聲明是不必要的。

這就是說,有一個CPU緩存鎖,你應該擔心。如果a[0]a[1]都屬於同一個64字節塊,它們將共享一個cache line,這意味着每個CPU內核都會嘗試將該內存塊加載到板載高速緩存中,從而鎖定任何其他CPU內核。如果發生這種情況,您的線程中只有一個線程可以一次訪問這些變量,並且任何其他線程都會阻塞,直到緩存被推回到主內存並且鎖定被釋放。這個問題(即false sharing)將會影響性能,使得多線程方法不會比單線程解決方案更好,甚至更糟糕。沒有辦法關閉這個鎖,儘管你可以通過將你的變量放在內存中來避免它,使它們落入不同的64字節塊。

(64字節是基於現代Wintel的...你的經驗可能會有所不同)

+0

非常感謝帖子+1 – Scavs