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 ?
volatile
- Dirty Oerti
- Beiträge: 2229
- Registriert: Di Jul 08, 2008 5:05 pm
- Wohnort: Thurndorf / Würzburg
Re: volatile
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
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.
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.
Re: volatile
Hey nicht schlecht.
Und hat
gemacht.
aber eine Frage hätte ich noch und zwar was ist ein EAX Register ?

Und hat


aber eine Frage hätte ich noch und zwar was ist ein EAX Register ?
C ( Durchschnittlich ) C++ (am Lernen)
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: volatile
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.
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.
Das Akkumulator-Register der CPU. In dem Fall als Enhanced Version (32 Bit).aber eine Frage hätte ich noch und zwar was ist ein EAX Register ?
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: volatile
Ein weiteres Beispiel das mir einfällt kommt noch von der Programmierung von Mikrocontrollern:
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.
Code: Alles auswählen
volatile int x;
x = 1;
if( x == 1 )
{
/* ... */
"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
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: volatile
@Kerli: sehr guter Zusatz 
Ich pack den Thread mal ins Wiki-Todo, um Volatile zu beschreiben.

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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.