Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was macht "volatile"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.10.2004, 13:19 Uhr
~mike_gast
Gast


Hi!
Ich versuche zu verstehen was volatile macht - leider habe ich noch keine gute Erklärung gefunden. Kennt jemand ne gute?

Danke im Voraus,
mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.10.2004, 13:22 Uhr
0xdeadbeef
Gott
(Operator)


volatile bedeuetet, dass die Variable auf jeden Fall im Speicher, und nicht in einem Register abgelegt wird. Wenn du eine Variable in mehreren Threads benutzt, sicherst du damit, dass eine Veränderung in einem Thread auch zur gleichen Zeit eine Veränderung in den anderen Threads bewirkt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.10.2004, 13:25 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Aus der MSDN:

Zitat:

The volatile keyword specifies that the value associated with the name that follows can be modified by actions other than those in the user application. Therefore, the volatile keyword is useful for declaring objects in shared memory that can be accessed by multiple processes or global data areas used for communication with interrupt service routines.


Du kannst also eine solche Variable aus anderen Programmen ändern, wo sonst eine Zugriffsverletzung kommen würde.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.10.2004, 13:36 Uhr
virtual
Sexiest Bit alive
(Operator)


Kleine Ergänzung:

In der praxis kann man volatile auch verwenden, um zu verhindern, daß eine Variable beim Kompilieren fortoptimiert wird. zB:

C++:
static volatile sourceTag = __FILE__ "$Name: tag_0815$";


Könnte in einer .c oder .cpp Datei stehen, einfach um den Versionsstempel einer Datei, die von einerm Source Control system (hier: cvs) verwaltet wird, auch im Executable zu haben. In der Regel wird man sourceTag aber nicht im Source selbst nutzen, weshalb der Compiler es in der Regel entfernen wird. Wenn man aber volatile angibt, dann entfernt er es eben nicht. Unter UNIX kann man kann man dann mittels

C++:
strings executable | grep "\$Name:"


ziemlich schnell herausbekommen, mit welchen CVS Tags hier gearbeitet wurde.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.10.2004, 15:09 Uhr
ao

(Operator)


Nochn Versuch:

Der Optimizer darf Variablenzugriffe wegoptimieren, wenn sie wirkungslos sind bzw. wenn für ihn keine Wirkung erkennbar ist (mal vereinfacht ausgedrückt). Beispiel:


C++:
bool bEventDetected = false; /* Zeigt an, ob ein Ereignis eingetreten sit */

/* Warten auf ein Ereignis */
while (!bEventDetected)
{
    sleep (1); /* bisschen warten */
}

/* Wenn wir hier ankommen, liegt ein Ereignis vor, und wir verarbeiten es */
...



Stell dir vor, du bist in einem Multithreaded-Programm. Mit dem oben gezeigten Code wartet ein Thread auf ein Ereignis (könnte z.B. ein Mausklick sein) und geht dann weiter.

Die Information, dass das Ereignis eingetreten ist, wird von einem anderen Thread bereitgestellt:


C++:
extern bool bEventDetected;

/* Ereignis anzeigen */
bEventDetected = true;
...



Wenn der Compiler den oberen Code übersetzt, erkennt er, dass nichts in der Schleife den Wert von bEventDetected verändert, er könnte also (optimierend) folgenden vermeintlich äquivalenten Ersatzcode erzeugen:

C++:
if (!bEventDetected) /* Flagge nur einmal prüfen */
{
    while (1)  /* wenn sie false ist, bleibt sie es auch -> Endlosschleife */
    {
        sleep (1);
    }
}



Beim Übersetzen des anderen Threads könnte der Compiler erkennen, dass der Schreibzugriff auf bEventDetected wirkungslos ist, weil die Variable anschließend nirgendwo abgefragt wird. Aggressiv optimierend könnte er also die komplette Schreibaktion wegwerfen, und der Handshake zwischen den Threads würde nicht funktionieren.

Jetzt kommt volatile ins Spiel: Mit volatile sagen wir dem Compiler: Alle Zugriffe auf diese Variable so ausführen, wie sie im Quellcode stehen. Auch wenn du glaubst, dass es Unsinn ist, optimier es trotzdem nicht weg.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.10.2004, 11:35 Uhr
~mike_gast
Gast


Ahh. Es kommt einwenig Licht ins Dunkle Ich werde versuchen den Fehler aus meinem Programm nun zu beheben. Hoffe es geht

Danke,
mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: