volatile

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
soufian88
Beiträge: 288
Registriert: So Jan 18, 2009 1:01 pm

volatile

Beitrag von soufian88 » Di Mär 31, 2009 6:19 pm

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 ?
C ( Durchschnittlich ) C++ (am Lernen)

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: volatile

Beitrag von Dirty Oerti » Di Mär 31, 2009 6:29 pm

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
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
soufian88
Beiträge: 288
Registriert: So Jan 18, 2009 1:01 pm

Re: volatile

Beitrag von soufian88 » Di Mär 31, 2009 6:54 pm

Hey nicht schlecht. :D
Und hat :idea: gemacht. :lol:

aber eine Frage hätte ich noch und zwar was ist ein EAX Register ?
C ( Durchschnittlich ) C++ (am Lernen)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8569
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: volatile

Beitrag von Xin » Di Mär 31, 2009 6:59 pm

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).
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: volatile

Beitrag von Kerli » Di Mär 31, 2009 7:34 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8569
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: volatile

Beitrag von Xin » Mi Apr 01, 2009 12:22 pm

@Kerli: sehr guter Zusatz :-)

Ich pack den Thread mal ins Wiki-Todo, um Volatile zu beschreiben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten