Synchronisations- und Ordnungsbedingungen

Inhaltsverzeichnis[Anzeigen]

Mit diesem Artikel geht unsere Tour in das C++-Speichermodell ein Stückchen tiefer. Haben sich die bisherigen Artikel mit der Atomizität der atomaren Variablen beschäftigt, so geht es nun um die Synchronisations- und Ordnungsbedingungen von Operationen.

 

Während die Atomizität eines atomaren Datentyps nicht konfiguiert werden kann, lässt sich an den Synchronisations- und Ordnungsbedingungen der atomaren Operationen sehr stark drehen. Eine Stellschraube, die weder das C#- noch das Java-Speichermodell besitz.

Die sechs Varianten des C++-Speichermodells

C++ besitzte sechs Varianten des Speichermodells. Per Default wird für jede atomare Operation std::memory_order_seq_cst verwendet. Explizit kann auch eines der anderen fünf Speichermodelle verwendet werden. Welche Speichermodelle bietet C++11 an?

 

enum memory_order{
  memory_order_relaxed,
  memory_order_consume,
  memory_order_acquire,
  memory_order_release,
  memory_order_acq_rel,
  memory_order_seq_cst
}

Um die sechs Speichermodelle zu strukturieren, sind zwei Fragen sehr hilfreich.

  1. Für welche atomaren Operationen sind die Speichmodelle konzipiert?
  2. Welche Synchronisations- und Ordnungsbedingungen definieren die Speichermodelle?

Beide Fragen beantworten die zwei nächsten Unterkapitel.

Typen von atomaren Operationen

Die Speichermodelle sind für die lesenden und/oder schreibenden atomaren Operationen konzipiert. 

  • read Operationen: memory_order_acquire und memory_order_consume
  • write Operationen:memory_order_release
  • read-modify-write Operationen: memory_order_acq_rel und memory_order_seq_cs
memory_order_relaxed definiert keine Synchronisations- und Ordnungsbedingungen. Daher passt es nicht in diese Klassifizierung.

 

Die Tabelle klassifiziert die atomaren Operationen basierend auf ihren lesend und/oder schreibenden Charakteristiken. 

atomicOperationsReadWrite

Wird eine atomare Operation atomVar.load(5) mit einem Speichermodell verwendet, das für eine write oder read-modify-write Operation konzipiert ist, dann besitzt der write Aspekt der Operation keine Auswirkung. So ist atomvVar.load(5,std::memory_order_acq_rel) äquivalent zu atomVar.load(5,std::memory_order_acquire), so ist atomVar.load(5,std::memory_order_release) äquivalent zu atomVar.load(5, std::memory_order_relaxed).

Verschiedene Synchronisations- und Ordnungsbedingungen

C++11 kennt drei verschiedene Klassen von Synchronisations- und Ordnungsbedingungen: 

  • Sequenzielle Konsistenz: memory_order_seq_cst 
  • Acquire-Release: memory_order_consume, memory_order_acquire, memory_order_release und memory_order_acq_rel
  • Relaxed: memory_order_relaxed

Während die sequenzielle Konsistenz eine globale Ordnung zwischen Threads definiert, definiert die Acquire-Release-Semantik eine Ordnung zwischen Lese- und Scheibeoperationen der gleichen atomaren Variablen auf verschiedenen Threads. Die Relaxes-Semantik sichert nur zu, dass Operationen auf der selben atomaren Variable in demselben Thread nicht umgeordnet werden können. Die Garantie wird modification order consistency genannt. Aber andere Threads können die Operationen in einer anderen Ordnung sehen.

Wie geht's weiter?

Zugegen, das war ein kurzer Artikel. Ich will aber meiner Idee treu bleiben, in jedem Artikel nur einen Schwerpunkt zu setzen.

Insbesondere die Abstufungen der verschiedenen Speichermodelle, deren Wirkungen auf atomare und nichtatomare Operationen, machen das C++-Speichermodell zu so einem spannenden aber auch herausfordernden Thema. In den nächsten Arikeln werde ich die Synchronisations- und Ordnungsbedingungen Sequenzielle Konsistenz, Acquire-Release-Semantik und Relaxed-Semantik sowohl in der Theorie als auch in der Praxis vorstellen. Los geht's im nächsten Artikel mit der Anwendung der sequenziellen Konsistenz. Die Grundlagen dazu habe ich bereits in dem gleichnamigen Artikel gelegt.

 

 

 

 

 

 

 

 

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.

 

Kommentar schreiben


Modernes C++

Abonniere den Newsletter

Inklusive zwei Artikel meines Buchs
Introduction und Multithreading

Beiträge-Archiv

Sourcecode

Neuste Kommentare