Frage

Muss ich zum Beispiel a sperren a bool Wert beim Multithreading?

War es hilfreich?

Lösung

Es gibt kein Atomar Typ. Nur Operationen kann atomar sein.

Lesen und Schreiben eines Datentyps, der in ein einzelnes Wort passt (int auf einem 32-Bit-Prozessor, long Auf einem 64-Bit-Prozessor ist technisch "atomic", aber der Jitter und/oder der Prozessor können sich entscheiden, Anweisungen neu zu ordnen und somit unerwartete Rassenbedingungen zu erstellen, sodass Sie entweder den Zugriff serialisieren müssen lock, benutze die Interlocked Klasse für Schreibvorgänge (und in einigen Fällen lesen) oder deklarieren Sie die Variable volatile.

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

Andere Tipps

Ähnliche Frage hier

Für die endgültige Antwort gehen Sie zur Spezifikation. :)

Partition I, Abschnitt 12.6.6 der CLI -Spezifikation heißt: "Eine konforme CLI muss garantieren, dass das Lesen und Schreiben von Zugriff auf ordnungsgemäß ausgerichtete Speicherorte nicht größer als die native Wortgröße ist atomar, wenn der gesamte Schreibzugriff auf eine Position gleich groß ist . "

Das bestätigt also, dass S_Initialized niemals instabil sein wird und das Lesen und Schreiben an Primitve -Typen atomar sind.

Ineinander erzeugt eine Speicherbarriere, um zu verhindern, dass der Prozessor liest und schreibt. Das Schloss erzeugt in diesem Beispiel die einzige erforderliche Barriere.

John.

Im Wesentlichen haben Sie kein "Crash" -Problem, wenn Sie keinen Bool sperrten. Was Sie möglicherweise haben, ist eine Rennbedingung für die Reihenfolge, für die der Bool aktualisiert oder gelesen wird. Wenn Sie in einer bestimmten Reihenfolge in eine bestimmte Reihenfolge geschrieben/lesen möchten, möchten Sie einen Sperrmechanismus verwenden.

Art von. Es gibt einen ausgezeichneten Faden darüber hier, Aber die Kurzversion ist, während eine bestimmte Lektüre oder Schreiben atomic sein mag, das ist fast nie das, was Sie tun. Wenn Sie beispielsweise eine Ganzzahl inkrementieren möchten, müssen Sie 1) den Wert lesen, 2) einen zum Wert hinzufügen und 3) den Wert zurückspeichern. Jeder dieser Operationen kann unterbrochen werden.

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

Statische primitive Typen sind Threadsafe, sodass Sie diese typisierten Variablen nicht sperren müssen. Jede Instanzvariable eines primitiven Typs ist jedoch nicht garantiert. Siehe hier: Sind primitive Typen wie Bool -Threadsafe?

MSDN Primestivetype -Klasse

Und hier ist ein weiterer nützlicher Link, der auch von Interesse sein könnte, von dem ich die Lösung sehr überzeugend finde: Also Frage: Woher weiß ich, ob eine C# -Methode fadensicher ist?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top