C++: Multithreading

Atomare Datentypen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
C++ besitzt einen Satz an atomaren Datentypen und erlaubt es darüber hinaus, eigene atomare Datentypen zu definieren.
04:51

Transkript

Das C++-Speichermodell basiert auf atomaren Datentypen. Daher will ich in dieser Lektion atomare Datentypen genau vorstellen. Atomare Datentypen gibt es seit C++11. Sie benötigen die Header-Datei "atomic". Was ist das Besondere an den atomaren Datentypen? Sie sichern atomare Operationen zu, klar, das denkt man sich, Aber sie geben auch Garantien für die Reihenfolge von atomaren Operationen. C++ hat an satzatomare Datentypen, ein relativ einfacher Satz. es gibt auch atomic flag und es gibt Atomic-Datentypen: rund um bool, Zeiger, und all integralen Datentypen wie Int, Int 32, U-Int. Sie können aber auch eigene atomare Datentypen definieren. Für die gelten aber besondere Einschränkungen. Was sind das für eine Einschränkung? Diese atomare Datentypen dürfen keine virtuellen Funktionen besitzen und auch keine virtuellen Basisklassen, können nur einen trivialen Copy-Zuweisungsoperator besitzen, dies gilt auch für alle Basisklassen. Was heißt trivialer Copy-Zuweisungsoperator? Das heißt, dieser Copy-Zuweisungsoperator muss vom Compiler erzeugt worden sein. Oder Sie haben ihn explizit durch das Schlüsselwort "default" angefordert. Anders ausgedrückt, sie dürfen nicht selber implementieren. Und dann müssen wir noch eigene atomare Datentypen auf Gleichheit bitweise vergleichbar sein. Und weiter geht's. Atomare Datentypen sind die Basis für die lockfreie Programmierung. Lockfreie Programmierung ist umgangssprachlich gesprochen das Programmieren ohne Mutexe. Diese Definition ist aber zu eng gefasst. Ein Codeabschnitt ist lockfree, wenn sich keine Prozesse bzw. Threads gegenseitig blockieren können und daher kein Locking benötigt wird. Es geht also nicht um Mutexe, es geht nur ums Locken. Jetzt kommt eine interessante Eigenschaft. Alle atomaren Datentypen, mit Ausnahme vom standard atomic flag, können innerhalb eines Mutex verwendet werden, das heißt, unter der Decke können die Mutexe verwenden. Tatsächlich verwendet keiner Implementierung, die ich kenne. Das ist moderner GCC, moderner Clang oder moderner Microsoft Visual C++ Compiler, unter der Decke Mutex sie dürfen es. Zum Schluss will ich Ihnen noch gern paar atomare Operationen vorstellen. Hier haben wir a.load als die atomare Variable, mit a.load laden Sie den Wert von a. Das nennt sich formal eine Acquire-Operation, also was Sie anfordern. Ja, und dann haben Sie den Wert in "res" zur Verfügung. Res ist natürlich dann eine nicht atomare Variable. Mit store machen Sie genau das Gegenteil: Sie speichern eine atomare Variable in die Variable b rein. Das nennt sich formal eine Release, also eine Freigabe-Operation. Hier diese interessante Funktion ist lockfree. Diese Funktion gibt Ihnen für jede atomare Variable zurück, ob sie intern einen Lock oder keinen Lock verwendet. Natürlich ist diese Methode nur für alle atomare Variablen, außer der atomaren Variable "atomic flag", definiert. Atomic_flag, wie Sie wissen, ist lock-free bei default. Durch A exchange B tauschen Sie die Werte von A und B aus. Und jetzt kommt die wichtigste aller atomaren Operationen. Die ist so wichtig, dass Sie diese Operation in jeder Atomaren Library finden. Die wird typischerweise gern "CAS" genannt – Compare and Swap. Hier heißt sie "compare_exchange_strong", und sie hat ein bisschen eigentümliche Syntax. Das ist atomare Variable a und jetzt prüft diese Operation mit dieser Methode, ob expected = a ist, wenn expected = a ist, wird a auf arc gesetzt, und als Ergebnis kriegen Sie True zurück, also die Bestätigung, dass es geklappt hat. Wenn expected ≠ a ist, dann wird expected auf a gesetzt und sie kriegen False zurück. Das heißt, die Operation kann schiefgehen oder sie kann nicht schiefgehen. Wenn sie schiefgeht, dann kriegen Sie ein false zurück und dann müssen Sie eventuell einen Loop drum rum machen, bis eben der Wert von a dem Wert von expected entspricht. Da gibt es noch atomare Increment- und Decrement-Operationen. Sie haben die Postfixnotation verwendet, Sie können auch die Präfixnotation verwenden. Und es gibt auch diese komponierten Zuweisungsoperatoren, wie z. B. +=, Natürlich können Sie auch "-=", "│=", "&=" und "˄=" verwenden. In dieser Lektion habe ich Ihnen einen Überblick über die atomaren Datentypen in C++ gegeben. Atomare Datentypen sind die Grundlage für das C++-Speichermodell.

C++: Multithreading

Lernen Sie die High-Level Threading-Schnittstelle in C++ kennenb und nutzen, die Sie in Form von Threads, Tasks, Locks und Bedingungsvariablen zur Anwendung bringen.

2 Std. 40 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:16.08.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!