volatile (Informatik)

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Volatile (deutsch flüchtig, wechselhaft) ist ein Zusatz bei der Deklaration von Variablen in Programmiersprachen wie C, C++, Java oder C#.

In C und C++ spezifiziert dieser Qualifizierer, dass sich der Wert der Variable jederzeit ohne expliziten Zugriff im Quelltext ändern kann. Dies geschieht beispielsweise durch andere Prozesse, Threads oder 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 verschiedene Threads zugreifen, 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. Der Zusatz volatile sorgt in Java nicht für gegenseitigen Ausschluss und ersetzt somit nicht Synchronisationsmechanismen (z. B. Locks oder Semaphore).[4]

Beispiele in C[Bearbeiten | Quelltext bearbeiten]

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

static volatile int status;

void poll_status(void)
{
    status = 0;

    while (status == 0)
        /* do nothing */;
}

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 status = 0;

   if (setjmp (env))
   {
      if (status == 1)
         puts ("Hello World");
      return 0;
   }

   status = 1;
   longjmp (env, 1);
}

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Should volatile Acquire Atomicity and Thread Visibility Semantics? In: C++ standards committee. 21. April 2006, abgerufen am 13. März 2018.
  2. British Standards Institute (Hrsg.): The C Standard. Incorporating Technical Corrigendum 1. (Includes the C Rationale. ISO/IEC 9899:1999). John Wiley & Sons, Chichester 2003, ISBN 0-470-84573-2, Kapitel 6.7.3.
  3. volatile (C# Reference). Microsoft, abgerufen am 13. März 2018 (englisch).
  4. Christian Ullenboom: Java ist auch eine Insel. Das umfassende Handbuch. (Aktuell zu Java 7). 10., aktualisierte Auflage. Galileo Press, Bonn 2011, ISBN 978-3-8362-1802-3, Kapitel 9.7.1. (openbook.galileodesign.de) , abgerufen am 30. Januar 2012.