C++: Speichermodell

Bruch der sequenziellen Konsistenz bei den Synchronisations- und Ordnungsbedingungen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Bei der Relaxed-Semantik gelten keine Synchronisations- und Ordnungsbedingungen. Lediglich die Atomizität der atomaren Operationen ist gewährleistet.
03:07

Transkript

In dieser Lektion stelle ich Ihnen das schwächste aller C++-Speichermodelle vor: die Relaxed-Semantik. Die Relaxed-Semantik definiert keine Synchronisations- und Ordnungsbedingungen. Das einzige, was die Relaxed-Semantik garantiert, ist die Atomizität der atomaren Operationen. Da stellt sich natürlich die Frage, was kann man mit der Relaxed-Semantik anstellen? In der Regel verfahren Sie so, dass Sie atomare Operationen mit strengeren Speicherordnungen verwenden, wie z.B. Acquire-Release-Semantik, und darin Operationen mit Relaxed-Semantik einsperren. Sie können auch die Acquire-Release-Semantik natürlich verwenden, um nicht-atomare Operationen einzusperren. Typische Anwendungsfälle für die Relaxed-Semantik sind atomare Zähler. Das klassische Beispiel ist das Inkrementieren eines Shared-Pointers. Dieses Inkrementieren kann Relaxed sein. Es ist nämlich egal, in welcher Reihenfolge der Counter für den Shared-Pointer hochgezählt wird. Entscheidend ist, dass die Operation atomar ist. Was macht die Relaxed-Semantik so anspruchsvoll? Sie macht so anspruchsvoll, weil es mit der Relaxed-Semantik vorkommen kann, dass ein Thread Operationen in einer anderen Reihenfolge wahrnimmt als sie ausgeführt wurden. Selbst in dem Thread können die Operationen in einer anderen Reihenfolge ausgeführt werden als im Sourcecode drin steht. Jetzt zeige ich Ihnen noch ein Beispiel zu einem atomaren Zähler. Ich fange mal hier an. Was mache ich hier? Ich habe hier einen "std: :vector" von Thread, hier erzeuge ich mit "emplace_back" jeweils einen neuen Thread. Jeder dieser Threads führt die Funktion "f" aus. Was macht "f"? "F" zählt von 0 bis 1000 und addiert 1 jeweils atomar hinzu, und das Ganze mit "memory_order_relaxed" versehen, also der Relaxed-Semantik. Hier starte ich den Thread, hier wartet der Erzeuger des Threads drauf, bis seine Kinder fertig sind. Und die entscheidende Beobachtung ist die, dass ich zwischen dem Erzeugen des Threads und dem Warten auf den Thread, die Threads hier einsperre. Die können hier nicht raus. Das Besondere ist jetzt, dass das Starten eines Threads Acquire-Semantik hat, dass das Joinen eines Threads Release-Semantik hat. Und damit ist alles, was hier drin passiert, synchronisiert. Das Schöne ist natürlich jetzt, dass, egal welcher Thread hier 1 drauf addiert, jeder Thread tut es atomar und damit ist das Programm wohldefiniert. D.h. es wird immer hier unten 10 mal 1000, also 10000, rauskommen. Und innerhalb dieses Bereiches hier können die Instruktionen umgeordnet werden ohne irgendwelche Einschränkungen, da ich hier alles mit der Relaxed-Semantik mache. In dieser Lektion habe ich die Relaxed-Semantik vorgestellt. Die Relaxed-Semantik ist das schwächste aller C++-Speichermodelle. Die Relaxed-Semantik wird gern für atomare Zähler verwendet.

C++: Speichermodell

Verstehen und nutzen Sie die Konzepte und die zugrundeliegenden TEchnolgien des Speichermodells in C++.

1 Std. 29 min (29 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.11.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!