2009-12-09 3 views
2

내가 가지고있는 DLL을 말해봐 다음 글로벌/정적 :를 ClassA의 구현과 함께을 LoadLibrary 정적/전역 및 스레드

ClassA Object; 

, 그것은 또한 제대로 작동하지 않습니다 '일반'ClassB가를 포함 ClassA가 아직 구축되지 않았다면 (ClassA가 정적/전역으로 된 이유입니다).

Windows에서는 DLL 로더가 ClassB의 생성자에 대한 호출에서이 DLL을로드한다고 생각합니까? 이 시점에서 ClassA가 생성되고 ClassB의 생성이 수행됩니다. 두 번째 스레드가 ClassB를 구성하고 생성하면 ClassA는 이미 구성되어 있으므로 생성되지 않습니다.

이제 제 질문은 - ClassB가 두 개의 스레드에 의해 동시에 구성되는 경우 어떻게할까요? 그래서 Thread 1은 ClassA를 구성하기 시작할 것입니다. 스레드 2는 ClassA의 생성자를 실행하기 전에 ClassA가 완전히 구성 될 때까지 기다릴 것입니까?

즉, LoadLibrary()는 CriticalSection을 사용하여 DLL의 정적/전역 변수에 대한 스레드 안전 초기화를 보장합니까? 내 직감은 '예'이지만 어떤 방법 으로든 다른 문서를 찾지 못하는 것 같습니다.

답변

1

DllMain은 "로더 잠금"이라는 내부 중요 섹션을 보유하면서 Windows 로더에 의해 호출되므로 정적 생성자는 DLL이 처음로드 될 때 한 번 발생하는 DLL_PROCESS_ATTACH 이벤트 중에 호출됩니다.

+0

감사합니다. 이것은 DllMain 문서를 암시하는 것으로 동의하지만, 다른 사람이 제 해석에 동의하게되어 안심입니다. –

1

DllMain에 대한 설명서를 살펴보십시오. 로더 잠금 및 초기화 순서에 대해 이야기합니다.

0

DLL은 여러 프로세스에서 공유하므로 EXE와 같이 초기화되지 않습니다. 당신이 필요로하는 것은 효과적으로 당신의 다른 객체를위한 일회성 팩토리 인 싱글 톤 객체입니다.

주, 나는

예를 들어 당신이

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

처음으로 같이가 someting를 가질 수 ... "를 ClassA"와 "ClassB가"당신이 그 클래스의 인스턴스를 의미하여 여기에 있으리라 믿고있어 이러한 함수를 호출하면 ClassA 및 ClassB의 전역 인스턴스가 올바르게 구성되었는지 확인할 수 있습니다.