Für die klassenspezifische Implementierung von new_handler bin ich auf das folgende Beispiel im Buch "effective c ++" gestoßen. Dies scheint ein Problem in Multithread-Umgebungen. Meine Frage ist, wie man in Multithread-Umgebungen klassenspezifischen new_handler erreicht.
%Vor% Sie haben Recht. Dies ist wahrscheinlich nicht threadsicher. Vielleicht möchten Sie einen alternativen Ansatz wie die nothrow
-Version von new
in Erwägung ziehen:
Dies führt dazu, dass Ihr klassenspezifischer Handler immer dann aufgerufen wird, wenn die Speicherzuweisung fehlschlägt. Ich würde das nicht tun, bis Sie wirklich alle Kopfschmerzen in Zusammenhang mit dem Überladen von operator new
verstehen. Lesen Sie insbesondere Herb Sutters zweiteiligen Artikel To New, Perchance to Throw, Teil 1 und Teil 2 . Interessanterweise sagt er, die nothrow
version zu vermeiden ... hmmm.
C ++ weiß (noch) nicht, was Threads sind. Sie müssen zu Ihrem Compiler / C ++ - Standard Bibliothek / Betriebssystem / Thread-Bibliothek Handbücher gehen, um eine thread-sichere Möglichkeit, dies zu tun, oder wenn es überhaupt möglich ist, zu bestimmen. Ich würde vorschlagen, dass der neue Handler in der Anwendung wahrscheinlich derselbe sein sollte. Es ist kein sehr flexibler Mechanismus, vielleicht würden Ihre Bedürfnisse besser mit einem Zuweiser oder vielleicht einer Fabrik (Funktion) bedient werden? Was möchten Sie innerhalb des benutzerdefinierten neuen Handlers tun?
Vielleicht siehst du es falsch an. Ich glaube nicht, dass es eine Möglichkeit gibt, die gesamte Anwendung von der Zuweisung von Speicher zu beschränken (da ein großer Teil der Speicherzuordnung außerhalb Ihres Codes liegt), der beste Weg wäre, zu kontrollieren, was Sie können - dh die Implementierung des Handlers.
Richten Sie den Handler so ein, dass er am Anfang des Programms eine Instanz einer "OutOfMemoryHandler" -Klasse aufruft (wie Sie es nennen) und das Standardverhalten hat, den vorhandenen Handler aufzurufen. Wenn Sie eine klassenspezifische Behandlung hinzufügen möchten, fügen Sie Ihrem OutOfMemoryHandler mithilfe Ihrer bevorzugten C ++ - Techniken für dynamisches Verhalten ein Verhalten hinzu.
Diese Lösung sollte in einer Single-Threaded-Umgebung funktionieren, aber in einer Umgebung mit mehreren Threads fehlschlagen. Damit es in einer Multithread-Umgebung funktioniert, muss der Aufrufer das Handler-Objekt benachrichtigen, dass es in einem bestimmten Thread arbeitet. Die Übergabe der Thread-ID mit der Klasse wäre ein guter Weg, dies zu tun. Wenn der Handler aufgerufen wird, überprüft er die Thread-ID und bestimmt das auszuführende Verhalten basierend auf der zugeordneten Klasse. Wenn der Aufruf von new () beendet ist, lege die Thread-ID einfach ab, um das korrekte Standardverhalten sicherzustellen (ähnlich wie du es bereits beim Zurücksetzen des Standard-Handlers getan hast).
Tags und Links c++ multithreading new-operator operator-overloading