2016-08-28 10 views
-1

Wenn ich eine Variable mit dem volatile Schlüsselwort deklariere, ist es jetzt absolut Thread-sicher, oder sollte ich noch in einigen Fällen darauf zugreifen über Interlocked Klasse oder lock Aussage?Erreichbarkeit flüchtige Variablen

+0

'volatile' verhindert nur eine Art von Optimierungen https://msdn.microsoft.com/en-us/library/x13ttww7.aspx" ... Felder, die als flüchtig deklariert sind, unterliegen nicht den Compiler-Optimierungen, die den Zugriff durch annehmen ein einzelner Thread ... "; 'volatile' ist keine Silberkugel und Sie müssen" ... in einigen Fällen immer noch über Interlocked-Klasse oder Lock-Anweisung darauf zugreifen " –

Antwort

2

Das Schlüsselwort volatile fügt nur eine vollständige memory barrier - garantiert, dass alle Lese-Schreib-Anweisungen in der CPU-Pipeline abgeschlossen sind. Für den Endanwender ist die Sichtbarkeit in anderen Threads garantiert, denn wenn ein Schreibvorgang abgeschlossen ist, wird das Ergebnis in den Cache der CPU (und gegebenenfalls in den RAM) übertragen. Sie sollten sich nicht darum kümmern, während Sie die App auf den neuesten Intel-CPUs laufen lassen - sie garantieren Barrieren beim Lesen und Schreiben ohne zusätzliche explizite Anweisungen.

Die Interlocked andererseits sperrt den CPU-Bus durch die angegebene Speicheradresse und ermöglicht es Ihnen, eine atomare Operation auf einer Variablen durchzuführen, so dass kein anderer CPU-Kern gleichzeitig andere Lese-Schreib-Operationen mit derselben Speicheradresse ausführen kann Zeit. Diese atomaren Operationen sind eigentlich Befehle der x86-CPU-Architektur-Familie, deshalb haben Sie eine begrenzte Anzahl von Operationen: hinzufügen, inkrementieren, dekrementieren, austauschen, vergleichen-Austausch.

Sowohl volatile als auch Interlocked beziehen sich auf CPU-Funktionen, aber gemeinsame Synchronisationsgrundelemente - kritischer Abschnitt, Spin Lock, Mutex, Semaphor, Auto/Manuelles Reset-Ereignis - sind darüber hinaus aufgebaut.