Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Speichermodell

std::atomic

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
std::atomic ist ein Klassen-Template, mit dem sich auch eigene atomare Datentypen umsetzen lassen.
04:37

Transkript

In dieser Lektion möchte ich Ihnen das Klassen-Template "std: :atomic" genauer vorstellen. Alle weiteren Datentypen sind teilweise oder vollständige Spezialisierungen von "std: :atomic". Das betrifft Zeiger, das betrifft Integrale Typen, das betrifft aber auch Eigene Typen. D.h. Sie können auch eigene Typen zu atomaren Typen machen. Für eigene Datentypen gelten aber besonders strenge Regeln. Sein Copy-Zuweisungsoperator und der aller seiner Basisklassen muss trivial sein. Trivial sein: entweder haben Sie nicht implementiert oder Sie haben ihn vom Compiler durch "is=default" angefordert. Ihr eigener Datentyp darf keine virtuellen Methoden oder auch virtuelle Basisklassen besitzen. Im Endeffekt läuft es darauf hinaus, dass Ihr eigener Datentyp bitweise vergleichbar sein muss. Hier habe ich Ihnen zusammengestellt, welche Operationen für welchen atomaren Datentyp zur Verfügung stehen. Ich beschreibe mal die Methoden hier alle von oben nach unten. "test_and_set": diese Operation gibt es nur für's atomic Flag; genauso wie "clear". Das Besondere an atomic flag ist es, dass es der einzige Datentyp ist, der per Definition lock-frei ist. Daher haben alle weiteren Datentypen, wie atomic <Bool, atomic <Zeiger, atomic <Integraler Typ, und atomic <Eigener Typ, haben alle weiteren Datentypen die Methode "is_lock_free". Damit können Sie abfragen, ob der Datentyp tatsächlich lock-frei implementiert ist. Dann gibt es die zwei Methoden hier: "load_restore", damit können Sie den Wert laden und speichern; "exchange" tauscht Ihnen zwei atomare Variablen aus. Hier die zwei Funktionen "compare_exchange_weak" und "compare_exchange_strong". "compare_exchange_weak" ist eine einfachere Variante von "compare_exchange_strong". "compare_exchange_weak" erlaubt nämlich, dass "forced" zurückgegeben wird, obwohl die zwei Werte atomar ausgetauscht werden. Weiter geht es mit "fetch_add" und "+is=". Der Unterschied zwischen "fetch_add" und "+is=" ist, dass bei "fetch_add" der alte Wert zurückgegeben wird, bei "+is=" der neue Wert. Sie wenden hier eine atomare Addition an, hier eine atomare Subtraktion "or" and in "x_or", je bitweise atomarer Vergleich. Und hier haben Sie noch ein Inkrement und ein Dekrement. Und wenn Sie hier ganz scharf drauf schauen, fällt Ihnen auf, es gibt keine Multiplikation oder Division. Das ist aus zwei Gründen nicht schlimm. Erstens brauchen Sie eine atomare Multiplikation relativ selten. Zweitens können Sie die auch selber implementieren. Für Division trifft natürlich das Gleiche zu. Und jetzt zeige ich Ihnen noch eine atomare Multiplikation. Ich habe hier ein Funktions-Template definiert: "fetch_mult". Dieses Funktions-Template nimmt eine atomare Variable "shared" an, per Referenz, weil ich sie ja verändern will, und einen Value "T", mit dem ich meine atomare Variable multiplizieren will. Wie geht's weiter? Zuerst lade ich hier den alten Wert von "shared" in "oldValue" rein und hier ist sozusagen das Herz der Funktion. Was passiert hier? Durch "shared_compare_exchange_strong" vergleiche ich, ob der Wert von "shared" "oldValue" entspricht. Besitzt "shared" den Wert "oldValue", setze ich "shared" auf "oldValue*mult", also ich wende die Multiplikation an. Entspricht "shared" nicht "oldValue", dann setze ich "oldValue" auf "shared", bekomme in diesem Fall bei dieser Operation den Wert "forced" zurück, iteriere nochmals drüber und wende die Operation nochmals an, bis ich eben "true" zurückbekomme, weil in diesem Fall "shared" gleich "oldValue" ist und ich damit die Multiplikation ausführen konnte. Und jetzt zeige ich Ihnen noch, wie man die Funktion anwendet, eigentlich relativ angenehm. Ich sage nur: "fetch_mult(myInt, 5)"; "myInt" ist eine atomare Variable, tatsächlich ist es eine atomare ganze Zahl, die ich mit 5 initialisiere, und 5 mal 5 ist 25 und genau das sehen Sie hier auch. Ausgeführt auf der cmd.exe. In dieser Lektion habe ich Ihnen das Klassen-Template std: :atomic vorgestellt. Das Klassen-Template, das Spezialisierungen für Zeiger, Integrale Typen und auch Eigene Datentypen anbietet.

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!