Das Schlüsselwort bedeutet ja nur, dass die Variable immer, wenn sie irgendwie benutzt wird, vom Hauptspeicher (RAM) gelesen wird und nicht in einem Register zwischengespeichert wird.
Wenn nun ein anderer Prozess mittels Shared Memory auf die Variable zugreifen kann und sie verändert, dann ist das notwendig.
Bsp:
Prozess A hat eine Variable X
Prozess A bekommt die CPU zugeteilt. Berechnet: X = 5. Dazu verwendet A das z.B. EAX Register. Der nächste Schritt wäre nun X = X*2. Bevor nun aber dieser Schritt ausgeführt wird, startet ein Debuger (z.B. mir fällt eben grad nichts besseres ein), dieser verändert den Wert von X (der Debuger hat dazu Zugriff auf den Speicher des Prozesses A), sagen wir auf 3.
Dies ist wahrscheinlich durchaus gewollt.
X = 5 ist also der "falsche Wert", während X = 3 "richtig" (von Sicht des Debugenden aus mal betrachtet) ist.
Nun läuft das Programm weiter. Welchen Wert hat X nun nach der Rechneroperation X = X * 2 ?
Wenn X als volatile gekennzeichnet ist, dann hat X zum Schluss den erwünschten Wert 6.
Wenn X aber als "normale" Variable gekennzeichnet ist und in ein Prozessorregister geladen ist (Die Register speichert die CPU für jeden Prozess einzeln ab, wenn ein Prozess gewechselt wird), dann wird der Wert von X 10 betragen, trotz der externen Veränderung.
(Ein Debuger ist aber in Wirklichkeit nicht auf die Deklaration als volatile angewiesen, zumindest soweit ich weiß)
Ich hoffe ich konnte dir das etwas näher bringen
MfG
Daniel