可以說我們有一個兩個元素的數組,它們是一些原始值的類型。在多線程環境下讀寫數組
volatile int[] a = new int[2]{0,0};
我有兩個線程,每個線程寫入/讀取其中一個元素。 第一個線程工作只有與[0]和第二個線程工作只有與[1]。
即使不同的索引值受到影響,數組是否可以這樣工作,或者數組仍然要求爲鎖定,即使不同的索引值受到影響?
可以說我們有一個兩個元素的數組,它們是一些原始值的類型。在多線程環境下讀寫數組
volatile int[] a = new int[2]{0,0};
我有兩個線程,每個線程寫入/讀取其中一個元素。 第一個線程工作只有與[0]和第二個線程工作只有與[1]。
即使不同的索引值受到影響,數組是否可以這樣工作,或者數組仍然要求爲鎖定,即使不同的索引值受到影響?
線程不需要在未被任何其他線程使用的內存位置上發出鎖定。所以在你的情況下,lock
聲明是不必要的。
這就是說,有一個CPU緩存鎖,你應該擔心。如果a[0]
和a[1]
都屬於同一個64字節塊,它們將共享一個cache line,這意味着每個CPU內核都會嘗試將該內存塊加載到板載高速緩存中,從而鎖定任何其他CPU內核。如果發生這種情況,您的線程中只有一個線程可以一次訪問這些變量,並且任何其他線程都會阻塞,直到緩存被推回到主內存並且鎖定被釋放。這個問題(即false sharing)將會影響性能,使得多線程方法不會比單線程解決方案更好,甚至更糟糕。沒有辦法關閉這個鎖,儘管你可以通過將你的變量放在內存中來避免它,使它們落入不同的64字節塊。
(64字節是基於現代Wintel的...你的經驗可能會有所不同)
非常感謝帖子+1 – Scavs
這將有助於 - https://stackoverflow.com/questions/1460634/are-c-sharp-arrays-thread-安全 – kiziu