Destruktion statischer Variablen mit Dependencies



  • Hi,
    ich habe keinen Zugriff auf das Ende der main()-Funktion eines Programms.
    Bei der Zerstörung einiger statischer Variablen werden Destruktoren aufgerufen, die andere statische Variablen benötigen.

    Kann ich irgendwie feststellen, ob ich mich in der Programmterminierung befinde oder eine Konstruktions-Destruktionsreihenfolge für statische Variablen erzwingen?

    Habor



  • @Habor

    eine Konstruktions-Destruktionsreihenfolge für statische Variablen erzwingen?

    Wenn sie in verschiedenen Übersetzungseinheiten definiert sind: nein.



  • Mann kann eine atexit Funktion registrieren und ein Flag setzen, dann weiss man wo man ist.

    Finde aber das ist eher ein Hack und vlt. solltest du deinen statischen Variablen auf z.B: unique Ptr umbauen, die auf 0 initialisiert werden, vlt. noch mit einer Hilfsfunktion zum Zugriff rundrum. Dann gleich am Anfang initiliasieren und kurz vor Ende dann die Ptr wieder in der richtigen Reihenfolge auf 0 setzen.



  • "std::aexit" läuft u.U. parallel zur Abräuming der Statics. Ich habe also keine Garantie, dass es nicht zu spät aufgerufen wird.

    The functions may be called concurrently with the destruction of the objects with static storage duration and with each other, maintaining the guarantee that if registration of A was sequenced-before the registration of B, then the call to B is sequenced-before the call to A, same applies to the sequencing between static object constructors and calls to atexit: see std::exit
    https://en.cppreference.com/w/cpp/utility/program/atexit

    Da ich keinen Zugriff auf das "Ende" des Programms habe, kann ich auch keine Hilfsfunktionen manuell vorher triggern.

    Also um das Ganze ein bisschen auszuführen:
    Ich habe ein Pluginsystem und arbeite Bibliotheksübergreifend (global) mit Variants (ein "any" Typ) und Reflections (Typinformationsklasse mit u.a. gespeicherten Member-Funktionspointern).
    Um sicher ein Plugin in einer multithreaded Umgebung zu entfernen, arbeite ich mit (statichen) SpinLocks. Dadurch kann ich während des Unloads jeglichen Zugriff in den beiden Klassen auf u.U. invalide Pluginpointer verhindern und in Ruhe Aufräumen.
    https://www.c-plusplus.net/forum/topic/350035/function-pointers-nach-plugin-unload

    Wenn nun das Programm runterfährt, wird der wichtigste statische SpinLock zerstört, noch bevor das letzte Variant oder die letzte Reflection abgeräumt wurde und die ganze Sache hängt sich dann in einem derer Destruktoren auf.
    Es bringt auch nichts den SpinLock zu wrappen und iwas zu nullen, weil der Speicher für diese Information u.U. ebenfalls freigegebender Speicher ist und damit keinen Lesezugriff mehr erlaubt.


Log in to reply