Open Source im professionellen Einsatz
Linux-Magazin 06/2014
303

Acquire-Release-Semantik

Der Unterschied zwischen den beiden Varianten von atomaren Operationen ist folgender: Listing 3 gibt keine explizite Memory-Ordnung an. Daher gilt der Standardfall – und der heißt sequenzielle Konsistenz. Somit befinden sich die atomaren Operationen auf dem Thread in einer totalen Ordnung. Im Gegensatz dazu baut die Acquire-Release-Semantik eine teilweise Ordnung der atomaren Operationen auf gleichen Variablen auf.

Relax!

Operationen auf atomaren Variablen verfügen über zwei wichtige Eigenschaften: Sie sind erstens atomar und zweitens definieren sie eine Ordnung (auf atomaren Operationen). Mit der Memory-Ordnung »std::memory_order_relaxed« wird die zweite Zusicherung vollkommen gebrochen. Das macht die Aussagen zu Listing 5 sehr einfach. Den ausführbaren Code darf der Compiler bei diesem Listing beliebig optimieren, lediglich die Atomizität der Variablen »x« und »y« ist sichergestellt. Damit entspricht seine Ausgabe der von Listing 1, in der alle Kombination von »x« - und »y« -Werten möglich sind.

Listing 5

Relaxed-Semantik

01 #include <iostream>
02 #include <atomic>
03 #include <thread>
04
05 std::atomic<int> x, y;
06
07 void writing(){
08   x.store(2000,std::memory_order_relaxed);
09   y.store(11,std::memory_order_relaxed);
10 }
11
12 void reading(){
13   std::cout << y.load(std::memory_order_relaxed) << " ";
14   std::cout << x.load(std::memory_order_relaxed) << std::endl;
15 }
16
17 int main(){
18
19   std::cout << std::endl;
20
21   std::thread thread1(writing);
22   std::thread thread2(reading);
23
24   thread1.join();
25   thread2.join();
26
27   std::cout << std::endl;
28
29 };

Ein feiner, aber entscheidender Unterschied zu dem undefinierten Verhalten von Listing 1 besteht allerdings: Die Werte von »x« und »y« sind nicht undefiniert, sodass sie keine beliebigen Bitmuster enthalten können. Zwischen den beiden Extremen der sequenziellen Konsistenz und dem Relaxed-Memory-Modell kennt C++ noch mehrere Abstufungen: Die Webseite zur Memory-Ordnung [3] liefert die weiteren Details.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Reichhaltiges Angebot

    C++0x bringt nicht nur Veränderungen in der Kernsprache. Die Standardbibliothek der C++-Neuausgabe hat Multithreading, asynchrone Funktionsaufrufe, reguläre Ausdrücke und vieles mehr im Angebot.

  • C++11

    2014 ist ein besonderes Jahr für C++. Drei Jahre nach C++11 erfährt der Sprachstandard mit C++14 den letzten Feinschliff. Neben generischen Lambda-Funktionen und der vereinfachten Ermittlung des Rückgabetyps kann C++14 vor allem mit einem Feature punkten: Reader-Writer-Locks.

  • C++

    Hochperformanten Code zu schreiben, den nur Eingeweihte zu würdigen wissen, ist für Entwickler ein bisschen so, wie für Formel-1-Testpiloten mit einem neuen Motor den Rundenrekord auf dem Nürburgring zu knacken. Doch oft endet der Tuningversuch in der Leitplanke.

  • C++11

    Die C++11-Reihe beschäftigt sich weiter mit dem Synchronisieren von Threads. Diesmal setzt der Chef-Thread Bedingungsvariablen ein, um die Tätigkeit seiner Mitarbeiter-Threads zu koordinieren.

  • C++

    Der neue Standard C++17 kündigt sich für 2017 an. Er wird zwar einige großartige Features wie eine Bibliothek für das Dateisystem mitbringen, doch andere lang ersehnte Funktionen fehlen wohl weiterhin.

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.