2010-05-09 5 views
12

Does 2 verschiedene Fäden mit:
Thema Sicherheit in C# Arrays

  • eine Lesung von einem C# Array (zB vom ersten Ort),
  • und ein weiteren auf den gleichen C# Array zu schreiben, sondern allgemein zum anderer Standort (zB bis zum letzten Standort)

ist Thread sicher oder nicht?
(Und ich meine hier ohne Locking Lesen oder Schreiben)

Antwort

8

Dieser spezielle Fall ist sicher, ja.

Das Lesen und Schreiben in verschiedene Teile eines Arrays beeinträchtigt nicht die anderen Operationen.

Das Lesen und Schreiben an denselben Speicherort kann jedoch je nach Elementtyp und Größe der Elemente Probleme verursachen.

+1

Solange diese Elemente in separaten CPU-Worten sind – Stewart

+0

+1 Niemals dachte, dies sei threadsafe, aber ich verstehe, warum es ist. Vielen Dank! –

+0

Es ist wichtig, bei der Verwendung von sperrfreien Algorithmen zu berücksichtigen, dass das, was Sie als "dieselbe Position" bezeichnen, nicht dasselbe ist, was die CPU (s) als dieselbe Position betrachten. Die CPU-Ansicht des Speichers unterscheidet sich sehr von der Ansichtssprache wie C gibt uns an, wo Bytes Adressen belegen. Auf einigen CPU-Architekturen (vor allem ARM, Power) auf einigen Datentypen auch das kann nicht sicher sein – Stewart

5

Lange Rede kurzer Sinn: Ja. Solange es an zwei verschiedenen Orten ist, ist es eine sichere Operation.

Es war eine discussion about this vor einer Weile, es hat einige nützliche Informationen, wenn Sie neugierig sind.

+0

+1 Ich dachte nie, dass dies sicher ist, aber ich verstehe, warum es so ist. Vielen Dank! –

7

Ich bin mir nicht sicher, dass dies garantiert sicher ist. Stellen Sie sich vor Sie haben byte []. Diese Bytes sind dicht im Speicher gepackt. Wenn Sie diese Bytes jetzt ändern, kann der Compiler einige der Schreibvorgänge koaleszieren, um Schreiboperationen mit Lese- und Schreiboperationen vom Typ Word (32 Bit) durchzuführen. Auf einigen CPUs, zum Beispiel ARM, ist dies die einzige Art von Speicher modifizierenden Anweisungen, die der Compiler hat. Dies ist besonders praktisch, wenn Sie mehr als ein Byte gleichzeitig bearbeiten. Die CPU kann das gleiche tun. Es kann auch Dinge neu ordnen, ohne dass du davon weißt. Angesichts dieser Art von Optimierung ist es möglich, dass ein Thread, der benachbarte Speicher liest, partielle Änderungen sieht. Sie sehen diese Art von Effekt normalerweise nicht, weil der Heap-Allokator nett zu Ihnen ist und Ihnen immer Speicher gibt, der mindestens wortorientiert ist.

+1

+1: Meiner Meinung nach ist dies die beste Antwort. Es ist immer am besten skeptisch zu sein, wenn es darum geht, sprachfreie Idiome zu schreiben. Ich kann an alle Arten von Speicherbarrierenproblemen denken, die Probleme verursachen könnten, selbst wenn die Threads mit verschiedenen Array-Positionen arbeiten würden. Es gibt einfach nicht genug Informationen in der Frage, um eine definitive Antwort zu geben. –