2012-10-08 10 views
9

Ist dies garantiert threadsicher/nicht zu unerwarteten Ergebnissen führen?Interlocked.Increment ein Integer-Array

Interlocked.Increment(ref _arr[i]); 

Meine Intuition sagt mir, das ist nicht, das heißt, den Wert in _arr Lesung [i] ist garantiert nicht ‚Atom‘ mit dem eigentlichen Inkrementieren zu sein.

Wenn ich richtig liege, dass das falsch ist, wie kann ich das beheben? Vielen Dank.

+0

Wer oder was liest den Wert in '_arr [i]'? Dieser Code liest es nicht, es erhöht es atomar, weil das ist, was "Interlocked.Increment 'tut. –

Antwort

13

Angenommen, nichts ändert sich i oder _arr, sollte das in Ordnung sein.

Ein Array wird als eine Sammlung von Variablen betrachtet; Ein ineinandergreifendes Inkrement sollte problemlos funktionieren, unabhängig davon, was mit diesem oder anderen Elementen im selben Array geschieht.

1

Wenn etwas ist asynchron _arr oder i dann ändern, würde ich Ihnen zustimmen, nein, die Lookup-_arr[i] ist nicht notwendigerweise atomare selbst.

Doch wie Jon sagt, wenn Sie ein Element von (etwas) _arr, identifizieren es wird atomar erhöht werden, unabhängig von anderen Aktionen in anderen Elementen des Arrays geschehen (s), oder Änderungen weiter zu _arr oder i.

Wenn _arr oder i asynchron geändert werden, alle Verweise auf sie (beide lesen und schreiben) müssen innerhalb eines lock auf einem gemeinsamen Ziel sein. (Und dann können Sie die Interlocked.Increment auf eine einfache ++ reduzieren.