いくつかのプリミティブ値の型である2つの要素の配列があるとします。マルチスレッド環境での配列の読み込みと書き込み
volatile int[] a = new int[2]{0,0};
私は2つのスレッドを持っていますが、それぞれが要素の1つを読み書きします。 最初のスレッドはで、は[0]、2番目のスレッドは、は[1]で動作します。
このように配列を配列できますか、配列が異なるインデックス値に影響を受けていてもがロックされている必要があります()。
いくつかのプリミティブ値の型である2つの要素の配列があるとします。マルチスレッド環境での配列の読み込みと書き込み
volatile int[] a = new int[2]{0,0};
私は2つのスレッドを持っていますが、それぞれが要素の1つを読み書きします。 最初のスレッドはで、は[0]、2番目のスレッドは、は[1]で動作します。
このように配列を配列できますか、配列が異なるインデックス値に影響を受けていてもがロックされている必要があります()。
スレッドは、他のスレッドで使用されていないメモリ位置でロックを発行する必要はありません。したがって、あなたの場合、lock
ステートメントは不要です。
言われていることは、あなたが心配する必要があるCPUキャッシュロックがあるということです。 a[0]
とa[1]
が両方とも同じ64バイトブロック内にある場合は、cache lineを共有します。つまり、各CPUコアはそのメモリブロックをオンボードキャッシュにロードし、他のCPUコアをロックしようとします。この場合、一度に1つのスレッドだけがその変数にアクセスでき、他のスレッドは、キャッシュがメインメモリにプッシュバックされ、ロックが解除されるまでブロックされます。 false sharingと呼ばれるこの問題は、パフォーマンスを低下させ、マルチスレッドアプローチをシングルスレッドソリューションよりも優れたパフォーマンスを発揮します。このロックをオフにする方法はありませんが、メモリ内に変数を配置して別の64バイトブロックに収まるようにすることで回避できます。
(64バイトは、現代のウィンテルに基づいています...あなたの経験は変更になる場合があります)
投稿+1のための非常に面白いおかげで – Scavs
これは役立つはず - https://stackoverflow.com/questions/1460634/are-c-sharp-arrays-thread-安全な – kiziu