2 Stimmen

LoadLibrary Static/Globals und Threads

Angenommen, ich habe eine DLL, die die folgenden statischen/globalen hat:

ClassA Object;

Zusammen mit der Implementierung von ClassA enthält sie auch eine "normale" ClassB, die nicht richtig funktioniert, wenn ClassA noch nicht konstruiert wurde (deshalb habe ich ClassA zu einer statischen/globalen Klasse gemacht).

Ich glaube, dass der DLL-Lader unter Windows diese DLL beim Aufruf des Konstruktors von ClassB lädt, richtig? Zu diesem Zeitpunkt wird ClassA konstruiert und dann folgt die Konstruktion von ClassB. Wenn ein zweiter Thread auftaucht und ClassB konstruiert, wird ClassA nicht konstruiert, da es bereits konstruiert wurde.

Meine Frage ist nun, was passiert, wenn KlasseB gleichzeitig von zwei Threads erstellt wird. Also beginnt Thread 1 mit der Konstruktion von ClassA. Wird Thread 2 warten, bis ClassA vollständig konstruiert ist, bevor er den Konstruktor von ClassB ausführt?

Mit anderen Worten: Verwendet LoadLibrary() eine CriticalSection, um eine thread-sichere Initialisierung der statischen/globalen Werte einer DLL zu gewährleisten? Meine Vermutung ist 'ja', aber ich kann keine Dokumentation finden, die das eine oder das andere sagt.

1voto

Luke Punkte 10524

Schauen Sie sich die Dokumentation für DllMain an; ich glaube, sie spricht über die Ladesperre und die Initialisierungsreihenfolge.

1voto

Aaron Klotz Punkte 10727

DllMain wird vom Windows-Loader aufgerufen, während er einen internen kritischen Abschnitt hält, der als "Loader Lock" bekannt ist, so dass Ihre statischen Konstruktoren während der DLL_PROCESS_ATTACH Ereignis, das nur einmal auftritt, wenn Ihre DLL zum ersten Mal geladen wird.

0voto

Foredecker Punkte 7337

DLLs werden nicht wie EXEs initialisiert, da sie von mehreren Prozessen gemeinsam genutzt werden. Was Sie brauchen, ist effektiv ein Singleton-Objekt, das eine einmalige Fabrik für Ihre anderen Objekte ist.

Anmerkung: Ich gehe davon aus, dass Sie mit "Klasse A" und "Klasse B" Instanzen dieser Klassen meinen...

Zum Beispiel könnte man etwas haben wie

ClassA& GetTheClassAInstance();
ClassB& GetTheClassBInstsance();

Wenn diese Funktionen zum ersten Mal aufgerufen werden, stellen sie sicher, dass Ihre globalen Instanzen von ClassA und ClassB richtig konstruiert wurden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X