Sukzessive Optimierung - Sequenzielle Konsistenz

Inhaltsverzeichnis[Anzeigen]

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.

 

 

 

 

Kommentare   

0 #1 Burning Feet 2016-02-26 20:00
Awesome blog you have here but I was wanting to know if you knew of any community forums that cover the same topics
discussed in this article? I'd really like to be a part of group
where I can get suggestions from other experienced people
that share the same interest. If you have any recommendations, please let me know.
Thanks!

Also visit my web blog - Burning Feet: http://hkdimsum.net/comment/html/index.php?page=1&id=29153
Zitieren
0 #2 GarthCSeegar 2016-09-22 06:11
I appreciate you finally talking about >Sukzessive Optimierung - Sequenzielle Konsistenz
Zitieren

Kommentar schreiben


Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare