Sukzessive Optimierung - Sequenzielle Konsistenz

Atomare Datentypen erlauben das Programm feingranular zu steuern und damit auch zu optimieren. Damit betreten wir aber die Domäne der Multithreading-Experten.

Sequenzielle Konsistenz

Wird das Speichermodell nicht explizit angegeben, kommt in C++ die sequenzielle Konsistenz zum Einsatz. Vereinfachend gesprochen, zeichnet sich die sequenzielle Konsistenz durch zwei Punkte aus. Jeder Thread führt seine Anweisungen in der Sourcecodereihenfolge aus und alle Threads folgen einer globalen Reihenfolge.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <atomic>
#include <iostream>
#include <thread>

std::atomic<int> x{0};
std::atomic<int> y{0};

void writing(){  
  x.store(2000);  
  y.store(11);
}

void reading(){  
  std::cout << y.load() << " ";  
  std::cout << x.load() << std::endl;
}

int main(){
  std::thread thread1(writing);
  std::thread thread2(reading);
  thread1.join();
  thread2.join();
};

 

Diese Information reicht schon aus, um das Programm zu analysieren. Da x und y atomar sind, ist das Programmverhalten frei von kritischen Wettläufen. Damit bleibt nur noch die Frage. Welche Werte für x und y sind möglich? Diese Aussage ist dank der globalen Reihenfolge aller Operationen auf den atomaren Variablen relativ einfach. 

Es gilt:

  1. x.store(2000); happens-before y.store(11);
  2. std::cout << y.load() << " "; happens-before std::cout << x.load() << std::endl;

Daraus folgt: x.load() kann nicht 0 zurückgeben, wenn y.load() 11 zurückgibt, denn x.store(2000) wird vor y.store(11) ausgeführt.

Alle anderen Werte für x und y sind möglich. Hier sind drei verschränkte Ausführungen der Threads, die die drei verschiedenen Ergebnisse für x und y erzeugen.

  1. thread1 wird vollständig vor thread2 ausgeführt.
  2. thread2 wird vollständig vor thread1 ausgeführt.
  3. thread1 führt nur die erste Operation x.store(2000) aus, bevor thread2 vollständig ausgeführt wird.

Die Tabelle fasst die Ausgaben für x und y zusammen.

sukzessiveOptimierungSequenzielleKonsistenz

Wie geht's weiter?

Die atomaren Operationen in diesem Programm sind entweder load oder store-Operationen, auch bekannt als acquire- und release-Operationen. Damit ist klar.

Im nächsten Artikel beschäftigen wir uns mit der nächsten Optimierungsstufe: Die Acquire-Release-Semantik.

 

 

 

 

 

 

title page smalltitle page small 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.

 

 

 

 

Mentoring

Stay Informed about my Mentoring

 

Rezensionen

Tutorial

Besucher

Heute 619

Gestern 1202

Woche 13384

Monat 40701

Insgesamt 3893415

Aktuell sind 69 Gäste und keine Mitglieder online

Kubik-Rubik Joomla! Extensions

Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare