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...