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.
Solange diese Elemente in separaten CPU-Worten sind – Stewart
+1 Niemals dachte, dies sei threadsafe, aber ich verstehe, warum es ist. Vielen Dank! –
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