Seite 1 von 1

volatile

Verfasst: Di Mär 31, 2009 6:19 pm
von soufian88
Der Attribut volatile ist mir jetzt neu und weiß inzwischen wofür es dienst ,aber wie soll ich das vorstellen ,dass das Schlüsselwort volatile das entsprechende wert außerhalb des Programms sich ändern kann.
Wenn man codet ist man doch die ganze Zeit am Programm beschäftigt und außerhalb des Programms coden ?
Wie soll das gehen ?

Re: volatile

Verfasst: Di Mär 31, 2009 6:29 pm
von Dirty Oerti
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

Re: volatile

Verfasst: Di Mär 31, 2009 6:54 pm
von soufian88
Hey nicht schlecht. :D
Und hat :idea: gemacht. :lol:

aber eine Frage hätte ich noch und zwar was ist ein EAX Register ?

Re: volatile

Verfasst: Di Mär 31, 2009 6:59 pm
von Xin
siehe Dirty Oerty.

volatile wird gebraucht, wenn mehrere Prozessoren auf eine Variable im gleichen Speicher zugreifen. Das war beispielsweise beim Amiga so, dass dieser über FastRAM für den Prozessor verfügte und sogenannten ChipRAM für die "Chips": Prozessor, Grafikprozessor, Soundprozessor, Blitter usw...
Dann muss dafür gesorgt werden, dass alle Prozessoren die veränderten Zustände sofort in den RAM zurückschreiben, damit andere Prozesse nicht mit veralteten Daten arbeiten.

aber eine Frage hätte ich noch und zwar was ist ein EAX Register ?
Das Akkumulator-Register der CPU. In dem Fall als Enhanced Version (32 Bit).

Re: volatile

Verfasst: Di Mär 31, 2009 7:34 pm
von Kerli
Ein weiteres Beispiel das mir einfällt kommt noch von der Programmierung von Mikrocontrollern:

Code: Alles auswählen

volatile int x;
x = 1;
if( x == 1 )
{
  /* ... */
Ohne volatile würde ein Compiler das if wegoptimieren dürfen. Das kann aber zu Problemen führen wenn x durch Interrupts verändert werden kann.

Re: volatile

Verfasst: Mi Apr 01, 2009 12:22 pm
von Xin
@Kerli: sehr guter Zusatz :-)

Ich pack den Thread mal ins Wiki-Todo, um Volatile zu beschreiben.