Was hat das Schlüsselwort volatile in C# und Java mit dem Schlüsselwort volatile in C++ gemein? Nichts!
volatile
Eigentlich ist alles so einfach in C++.
- volatile ist für speziellen Speicher konzipiert, auf dem lese- und schreibe-Operartionen nicht optimiert werden dürfen.
- std::atomic definiert atomare Variablen, die für den threadsicheren lesenden und schreibenden Zugriff konzipiert sind.
Eigentlich. Die Verwirrung beginnt aber genau hier. Das Schlüsselwort volatile in Java und C# besitzt die Bedeutung des Typs std::atomic in C++. Oder anders ausgedrückt. volatile besitzt keine Multithreading Semantik im C++-11-Standard.
volatile wird typischerweise in der embedded Programmierung eingesetzt um Speicherbereiche auszuzeichen, die unabhängig vom regulären Programmverlauf modifiziert werden können. Dies sind zum Beispiel Speicherbereiche, die ein externes Device (memory-mapped I/O) repräsentieren. Da diese Speicherbereiche sich unabhängig vom regulären Programmfluß verändern können, werden ihre Werte dank volatile direkt in den Hauptspeicher geschrieben. So findet kein optimiertes Speichern in den Zwischenspeichern (Caches) statt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <thread> volatile int x= 0; volatile int y= 0; void writing(){ x= 2000; y= 11; } void reading(){ std::cout << "y: " << y << " "; std::cout << "x: " << x << std::endl; } int main(){ std::thread thread1(writing); std::thread thread2(reading); thread1.join(); thread2.join(); }; |
Was bedeutet dies für unser kleines Programm aus Sukzessive Optimierung, wenn in diesem die int-Variablen zu volatile int-Variablen werden. Die Antwort ist ganz einfach. Das Programm enthält kritische Wettläufe der Variablen x und y. Damit ist der Programmverlauf undefiniert und somit keine Aussage über die Werte von x und y möglich.
Wie geht's weiter?
Mit diesem Artikel beende ich die Serie rund um Artikel zu Multithreading in Modernem C++. Zur besseren Orientierung verweise ich mit dem nächsten Artikel auf die Übersichtsseite aller Artikel.
Go to Leanpub/cpplibrary "What every professional C++ programmer should know about the C++ standard library". Hole dir dein E-Book. Unterstütze meinen Blog.
Weiterlesen...