2010-03-12 7 views

Antwort

15

Es gibt keine atomaren Typ. Nur Operationen können atomar sein.

Lese und einen Datentyp zu schreiben, die in ein einziges Wort paßt (int auf einem 32-Bit-Prozessor, long auf einem 64-Bit-Prozessor) ist technisch „atomic“, aber die Jitter und/oder den Prozessor können entscheiden, neu zu ordnen In diesem Fall müssen Sie entweder den Zugriff mit lock serialisieren, die Klasse Interlocked für Schreibvorgänge (und in einigen Fällen Lesevorgänge) verwenden oder die Variable volatile deklarieren.

Die kurze Antwort lautet: Wenn zwei verschiedene Threads auf dasselbe Feld/dieselbe Variable zugreifen können und mindestens einer von ihnen schreibt, müssen Sie eine Art Locking verwenden. Für primitive Typen ist das normalerweise die Klasse Interlocked.

+0

Ja, eine Operation kann atomar sein oder nicht, aber es gibt bestimmte Datentypen, die als atomare Typen bezeichnet werden, da sie atomare Operationen aufgrund ihrer Speichergrößenanforderungen in Bezug auf die Wortgröße auf dem System zulassen. – NebuSoft

+1

@NebuSoft: Bezogen auf wen oder was? Sicher nicht durch die C# Spezifikation. Siehe Abschnitt 5.5, * Atomarität von Variablenreferenzen *, die sich speziell auf die Atomizität von * reads * und * writes * bezieht - nicht von den Typen selbst. Jeder Typ kann gemacht werden, um bestimmte atomare Operationen zu erlauben, und es braucht nur zwei Zeilen Code, um eine nicht-atomare Operation auf einem primitiven Typ durchzuführen. – Aaronaught

+3

Entschuldigung, ich bezog mich auf die allgemeinen Begriffe: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html http://www-2.cs.cmu.edu/afs/cs/project/pscico/doc/nesl/manual/node14.html http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp ? topic =/com.ibm.ddi.doc/ddi160.htm http://download.oracle.com/docs/cd/B28359_01/gateways.111/b31053/ims_datatype_conver.htm Ich betone das einfach Es ist üblich, sich auf eine Variable als atombasierend zu beziehen, die auf dem Typ im allgemeinen Sinn beruht. – NebuSoft

2

ähnliche Frage here

Für die endgültige Antwort auf die spec gehen. :)

Partition I Abschnitt 12.6.6 der CLI spec heißt es: „Eine konforme CLI wird Garantie, dass Lese- und Schreibzugriff an Speicherplatz nicht größer als die nativen Wortgröße richtig ausgerichtet ist Atom wenn Alle Schreibzugriffe auf eines Ortes sind gleich groß. "

Damit wird bestätigt, dass s_Initialized nie instabil sein, und das Lesen und schreibt primitve Typen Atom sind.

Interlocking erstellt eine Speicherbarriere zu verhindern, dass der Prozessor von Neuordnung liest und schreibt. Die Sperre erzeugt in diesem Beispiel die einzige erforderliche Schranke in .

John.

Im Wesentlichen haben Sie kein "Absturz" -Problem, wenn Sie ein Bool nicht sperren. Was Sie haben können, ist eine Race Condition für die Reihenfolge, in der das Bool aktualisiert oder gelesen wird. Wenn Sie nicht wissen wollen, dass der Bool in einer bestimmten Reihenfolge geschrieben/gelesen wird, dann sollten Sie eine Art Sperrmechanismus verwenden.

2

Sort of. Es gibt einen ausgezeichneten Thread über diese here, aber die kurze Version ist, während ein gegebenes Lesen oder Schreiben atomar sein kann, das ist fast nie, was Sie tun. Wenn Sie beispielsweise eine Ganzzahl erhöhen möchten, müssen Sie 1) den Wert lesen, 2) einen Wert hinzufügen und 3) den Wert zurückspeichern. Jeder dieser Vorgänge kann unterbrochen werden.

Das ist der Grund für Klassen wie "Interlocked".

Verwandte Themen