Zum Beispiel muss ich einen Wert bool
beim Multithreading sperren?Sind primitive Datentypen in C# atomar (threadsicher)?
Antwort
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
.
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
@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
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
ä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.
Statische primitive Typen sind threadsafe, so dass Sie diese typisierten Variablen nicht sperren müssen. Jede Instanzvariable eines primitiven Typs ist jedoch nicht garantiert. Siehe hier: Are primitive types like bool threadsafe ?
Und hier ist eine andere nützliche Verbindung, die auch von Interesse sein könnten, die ich die Lösung sehr überzeugend finden: SO Frage: How do I know if a C# method is thread safe?
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".
- 1. C++ 11 Können nur primitive Datentypen als atomar deklariert werden?
- 2. Betrifft primitive Datentypen in C#
- 3. Sind in C# Lese- und Schreibzugriff auf Eigenschaften atomar?
- 4. Sind Java primitive ints atomar von Design oder zufällig?
- 5. Copykonstruktor tut primitive Datentypen
- 6. refrence Datentyp und primitive Datentypen in Javascript
- 7. Sind Zeiger primitive Typen in C++?
- 8. Sind + =, | =, & = etc atomar?
- 9. Entity-Mitglieder sollten sie primitive Datentypen oder Java-Datentypen sein?
- 10. Sind Methodenparameter in Java threadsicher?
- 11. Sind Java-Primitive unveränderlich?
- 12. Ist die Selbstinkremente in C threadsicher?
- 13. threadsicher char Zeichenfolge in C
- 14. Sind statische Variablen in GCC threadsicher?
- 15. Benutzerdefinierte Primitive in C#?
- 16. Sind statische Java-Initialisierer threadsicher?
- 17. Primitive boolesche Größe in C#
- 18. Sind Python-integrierte Container threadsicher?
- 19. Sind Quartz-Scheduler-Instanzen threadsicher?
- 20. Sind primitive Instanzvariablen standardmäßig in Objective-C initialisiert?
- 21. Warum Java nicht null zulassen, während primitive Datentypen deklarieren
- 22. C# -Datentypen vs. MySql-Datentypen
- 23. Was bedeutet es "Unveränderliche Zeichenfolgen sind threadsicher"
- 24. Warum unterstützt Java das Überladen von Funktionen für primitive Datentypen?
- 25. Warum funktionieren primitive Datentypen ohne den System-Namespace?
- 26. Welche Operationen im Knoten sind threadsicher?
- 27. Mit Streams mit Primitive Datentypen und die entsprechenden Wrapper
- 28. Sind Rsync-Operationen atomar auf Dateiebene?
- 29. Core Data „Verwendung skalaren Eigenschaften für primitive Datentypen“ das Kontrollkästchen
- 30. Sind redis-Operationen auf Datenstrukturen threadsicher
In den meisten Situationen, wenn Sie aus zwei Threads schreiben, sollten Sie eine Sperre verwenden ... –
Ich würde dann tun, was Mitch sagt. =) –