Sind C # -Structures Thread-sicher?

8

Ist eine C # -Struktur Thread-sicher?

Zum Beispiel wenn es ein:

gibt %Vor%

in einem anderen Typ:

%Vor%

ist Eigenschaft namens TheData, thread-safe?

    
Kaveh Shahbazian 28.02.2010, 22:48
quelle

6 Antworten

8

Nein, Strukturen in .NET sind nicht wirklich Thread-sicher.

Die copy-by-value Semantik, die Strukturen haben, hat jedoch große Relevanz für diese Konversation.

Wenn Sie Ihre Strukturen herumreichen und sie Variablen oder Pass-by-Value-Parametern zuweisen (keine ref- oder out-Schlüsselwörter), wird eine Kopie verwendet.

Das bedeutet natürlich, dass alle Änderungen, die an der Kopie vorgenommen werden, sich nicht in der ursprünglichen Struktur widerspiegeln, aber es ist etwas, auf das Sie achten sollten, wenn Sie sie weitergeben.

Wenn Sie direkt auf die Struktur zugreifen, ohne eine copy-by-value-Semantik zu verwenden (z. B. Zugriff auf ein statisches Feld vom Typ der Struktur und als Marc Gravel weist in seiner Antwort darauf hin, es gibt viele andere Wege) über mehrere Threads hinweg, dann muss man sich damit befassen Konto die Thread-Sicherheit der Instanz.

    
casperOne 28.02.2010, 22:56
quelle
9

Nun - best practice ist, dass Strukturen (außer in einigen sehr spezifischen Szenarien und selbst dann in Gefahr) immer unveränderlich sein sollten. Und unveränderliche Daten sind immer Thread-sicher. Also, wenn Sie Best Practice gefolgt sind und dies gemacht:

%Vor%

dann ja; das ist Thread-sicher. In allen anderen Fällen ist die Antwort "wahrscheinlich nicht".

Beachten Sie auch, dass Atomaritätsregeln gelten, sodass nicht einmal ein einzelnes Lesen oder Aktualisieren von DadData.TheData als threadsicher angenommen werden kann, auch nicht mit einer unveränderlichen Struktur. Sie könnten (besonders für übergroße Strukturen) einen Thread haben, der die Struktur liest, während ein anderer Thread sie neu schreibt; ohne Synchronisation werden schlimme Dinge passieren (irgendwann).

    
Marc Gravell 28.02.2010 22:58
quelle
1

A struct ist nicht mehr Thread-sicher als ein normales Feld oder eine Variable. Wenn Sie mindestens einen Thread haben, der diesen verändert, und mindestens ein weiterer Thread ihn gleichzeitig berührt, kann dies zu unerwartetem / undefiniertem Verhalten führen.

Veränderbare Strukturen sind auch Code-Gerüche. Gibt es einen bestimmten Grund, warum Sie eine struct anstelle von class benötigen? Benötigen Sie eine Werttyp-Semantik für diese Daten?

    
Aaronaught 28.02.2010 22:53
quelle
0

Verschiedene direkte Lese- und Schreibvorgänge verschiedener Mitglieder einer veränderbaren Struktur stören sich nicht gegenseitig. Der Zugriff verschiedener Threads auf denselben Member über Interlocked-Methoden verhält sich entsprechend der Semantik dieser Methoden. Diese Tatsachen können dazu führen, dass veränderbare Strukturen ein Thread-sicheres Verhalten erlauben.

Veränderbare Speicherorte, die Strukturen enthalten, die keine Möglichkeit zur Mutation bieten, außer einer vollständigen Ersetzung, bieten keinerlei Thread-Sicherheit, außer in Fällen, in denen eine Struktur entweder eine einzelne 32-Bit-Ganzzahl oder eine einzelne Objektreferenz enthält Solch ein (Einzel-Item) struct-Speicherort, während er geschrieben wird, garantiert garantiert vollständig alte Daten oder völlig neue Daten. Beachten Sie, dass es nicht möglich ist, eine der Interlocked-Methoden mit unveränderbaren Strukturen zu verwenden - sogar mit Strukturen, die nur eine einzelne Ganzzahl oder Objektreferenz enthalten.

    
supercat 07.02.2012 16:52
quelle
0

Nein, sind sie nicht. Ich habe eine sehr einfache App erstellt, um zu sehen, ob 10/10 Producer / Consumer-Threads auf dieselbe Strukturvariable zugreifen. Und schließlich wirst du Debugger.Break () sehen; wird getroffen werden. Bankguthaben sollte nie unter 0 gehen.

%Vor%     
Teoman shipahi 15.05.2015 16:42
quelle
-2

Nein. Warum wäre es threadsicher? Es sind nur Daten. Es wird nicht durch Magie thread-sicher.

    
John Saunders 28.02.2010 22:49
quelle