Volatile (Informatik)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Volatile ist ein Zusatz bei der Deklaration von Variablen in Programmiersprachen wie C, C++, Java oder C#.

In C und C++ wird durch diesen Typqualifikator spezifiziert, dass sich der Wert der Variable jederzeit ändern kann, beispielsweise durch andere Prozesse, Threads oder sogar externe Hardware[1]. Bei der Generierung des Maschinen-Codes aus einem in C oder C++ geschriebenen Programm verhindert die Kennzeichnung einer Variablen als volatile eine in diesem Fall die Funktionalität beeinträchtigende Optimierung, so dass das Programm immer auf den tatsächlich in der Hardware vorhandenen Wert zugreift.[2]

Im Gegensatz dazu werden bei Java und C# Variablen mit volatile gekennzeichnet, auf die von verschiedenen Threads aus zugegriffen wird, um die Sichtbarkeit zu synchronisieren.[3] Mit volatile gekennzeichnete Variablen werden in Java nicht zwischengespeichert (z. B. in Registern). Dadurch wird sichergestellt, dass auch bei Zugriff von mehreren Threads der richtige Wert gelesen wird. Volatile sorgt in Java nicht für gegenseitigen Ausschluss und ersetzt somit nicht Synchronisationsmechanismen (z. B. Locks oder Semaphoren).[4]

Beispiele in C[Bearbeiten]

Ohne den Zusatz volatile könnte der Compiler die Schleife im folgenden Programmausschnitt durch eine einfache Endlosschleife ersetzen und die Variable status wegoptimieren:

static volatile int status = 0;
 
void poll_status( void )
{
    while ( status == 0 )
        ;
}

In folgendem Beispiel könnte ohne volatile ein optimierender Compiler die bedingte Anweisung mit der Grußformel eliminieren.

#include <stdio.h>
#include <setjmp.h>
 
jmp_buf env;
 
int main ()
{
   volatile int a = 0;
 
   if (setjmp (env)){
      if (a)
	 puts ("Hello World");
      return 0;
   }
 
   a = 1;
 
   longjmp (env, 1);
}

Einzelnachweise[Bearbeiten]

  1. Publication on C++ standards committee website; http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html
  2. British Standards Institute (Hrsg.): The C Standard - Incorporating TC1 - BS ISO/IEC 9899:1999. John Wiley & Sons, 2003. ISBN 0-470-84573-2. Kapitel 6.7.3
  3. Vorlage:Internetquelle/Wartung/Zugriffsdatum nicht im ISO-Formatvolatile (C# Reference). Microsoft, abgerufen am 6. März 2012 (englisch).
  4. Vorlage:Internetquelle/Wartung/Zugriffsdatum nicht im ISO-FormatChristian Ullenboom: Java ist auch eine Insel 5. Kapitel 9.7.1. Galileo Computing, abgerufen am 30. Januar 2012 (deutsch, ISBN 3-89842-747-1).