C++: Speichermodell

Das Performanzproblem

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die native Umsetzung des Singleton Patterns in Multithreading-Programmen weist einen großen Nachteil auf. Selbst Lese-Zugriffe auf das Singleton-Objekt werden "teuer" synchronisiert.
03:05

Transkript

In dieser Lektion möchte ich Ihnen eine thread-sichere Singleton-Implementierung vorstellen, um dann in weiteren Lektionen diese thread-sichere Singleton-Implementierung zu verbessern. Zuerst einmal: Was ist ein Singleton Pattern? Das Singleton Pattern sichert zu, dass nur genau eine Instanz eines Objekts zur Laufzeit eines Programms existiert. Das Singleton Pattern. Hier eine einfache, aber zugegeben sehr naive Implementierung: "class MySingleton" setzt Singleton Pattern um. Wie macht es das? Als erstes hat es eine statische Methode, "getInstance". Was macht die statische Methode? Sie erzeugt auf Bedarf eine neue Instanz von MySingleton, eben wenn es noch keine Instanz davon gibt. Das macht es natürlich genau ein Mal. Wie geht es weiter beim Singleton Pattern? Sie müssen sichergehen, dass der Konstruktor und Destruktor vorhanden sind; in diesem Fall müssen sie privat sein und ich setze sie auf "default". Weiter gilt, dass der Copy-Konstruktor und der Copy-Zuweisungsoperator nicht zur Verfügung stehen; ich habe ihn hier auf "delete" gesetzt. Das sind "default" und "delete"; neue Schlüsselwörter in C++11, die Ihnen sicherstellen, dass per default der Compiler für die Implementierung dieses Konstruktes und Destruktes sorgt und dass hier der Compiler unterbindet, dass der Copy-Konstruktor im Copy-Zuweisungsoperator zur Verfügung steht. Ich will ja nur eine Instanz des Objektes haben: MyInstance ist das genau hier, die lege ich statisch an und die muss ich dann außerhalb der Klasse initialisieren; in diesem Fall auf den Null Pointer,"nullptr" Gut, so verwende ich dann die Singleton, indem ich MySingleton: getInstance aufrufe. Jetzt will ich noch mal auf getInstance zurückkommen: Das Entscheidende ist, da ich getInstance ja gleichzeitig von mehreren Threads ausführen kann, dass ich genau aber nur eine Instanz erzeuge. Daher muss ich den Prozess, die Instanz zu erzeugen, schützen. Schützen tue ich ihn hier durch "mutex", den ich in den "lock_guard" verpacke. Damit ist sichergestellt, dass genau nur eine Instanz von instance erzeugt wird, die ich hier zurückgebe. Wieso ist diese Implementierung sehr naiv? Sie ist aus diesem Grund sehr naiv, weil ich auf diese Methode getInstance meistens nur lesend zugreife, und wenn ich lesend drauf zugreife, muss ich ja nicht teuer locken. Locken, wie hier, ist eine sehr teure Operation, trotzdem verwende ich sie beim lesenden Zugriff. Ich will aber eigentlich nur sicherstellen, dass der schreibende Zugriff gesichert ist. Der schreibende Zugriff ist, wenn ich instance hier erzeuge. Genau das ist das Problem dieser Implementierung: Sie hat ein Performanzproblem. In dieser Lektion habe ich Ihnen eine naive, aber threadsichere Implementierung des Singleton Patterns vorgestellt. Diese werde ich natürlich in weiteren Lektionen jetzt verfeinern.

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!