これはスレッドセーフであることが保証されていますか/予期しない結果を生成しませんか?
Interlocked.Increment(ref _arr[i]);
私の直感では、そうではないことがわかります。つまり、_arr[i] の値の読み取りは、実際のインクリメントで「アトミック」であるとは限りません。
これが間違っていると考えるのが正しい場合、どうすればこれを修正できますか? ありがとう。
これはスレッドセーフであることが保証されていますか/予期しない結果を生成しませんか?
Interlocked.Increment(ref _arr[i]);
私の直感では、そうではないことがわかります。つまり、_arr[i] の値の読み取りは、実際のインクリメントで「アトミック」であるとは限りません。
これが間違っていると考えるのが正しい場合、どうすればこれを修正できますか? ありがとう。
i
または何も変わらないと仮定すると_arr
、それで問題ありません。
配列は変数の集合と見なされます。インターロックされたインクリメントは、その要素または同じ配列内の他の要素に何が起こっているかに関係なく、正常に機能するはずです。
何かが非同期に変更されている場合、_arr
またはその場合i
は同意します。いいえ、ルックアップ_arr[i]
自体は必ずしもアトミックであるとは限りません。
ただし、Jon が言うように、 (some) の要素を特定する_arr
と、配列の他の要素で発生する他のアクションや or へのさらなる変更とは無関係に、原子的にインクリメントされます。_arr
i
_arr
またはi
が非同期に変更される場合、それらへのすべての参照 (読み取りと書き込みの両方lock
)は、共通オブジェクトの内にある必要があります。(そして、 をInterlocked.Increment
単純な++
.