11

これはスレッドセーフであることが保証されていますか/予期しない結果を生成しませんか?

Interlocked.Increment(ref _arr[i]);

私の直感では、そうではないことがわかります。つまり、_arr[i] の値の読み取りは、実際のインクリメントで「アトミック」であるとは限りません。

これが間違っていると考えるのが正しい場合、どうすればこれを修正できますか? ありがとう。

4

2 に答える 2

16

iまたは何も変わらないと仮定すると_arr、それで問題ありません。

配列は変数の集合と見なされます。インターロックされたインクリメントは、その要素または同じ配列内の他の要素に何が起こっているかに関係なく、正常に機能するはずです。

于 2012-10-08T14:29:11.370 に答える
1

何か非同期に変更されている場合、_arrまたはその場合iは同意します。いいえ、ルックアップ_arr[i]自体は必ずしもアトミックであるとは限りません。

ただし、Jon が言うように、 (some) の要素を特定する_arrと、配列の他の要素で発生する他のアクションや or へのさらなる変更とは無関係に、原子的にインクリメントされます_arri

_arrまたはiが非同期に変更される場合、それらへのすべての参照 (読み取りと書き込みの両方lock)は、共通オブジェクトの内にある必要があります。(そして、 をInterlocked.Increment単純な++.

于 2013-05-27T05:45:10.090 に答える