假设我有一个具有以下静态/全局的DLL:
ClassA Object;
随着ClassA的实现,它还包含一个'常规'ClassB,如果还没有构造ClassA,它将无法正常工作(这就是我使ClassA成为静态/全局的原因)。
在Windows中,我相信DLL加载器会在调用ClassB的构造函数时加载此DLL,对吗?此时,将构建ClassA,然后将遵循ClassB的构造。如果第二个线程出现并构造ClassB,则不会构造ClassA,因为它已经构造了。
现在,我的问题是 - 如果ClassB由两个线程同时构建,该怎么办?因此,线程1将开始构建ClassA。在执行ClassB的构造函数之前,线程2是否会等到ClassA完全构造?
换句话说,LoadLibrary()是否使用CriticalSection来确保DLL的静态/全局变量的线程安全初始化?我的预感是'是',但我似乎找不到任何文件说这种或那种方式。
答案 0 :(得分:1)
查看DllMain的文档;我相信它谈论了加载程序锁定和初始化顺序。
答案 1 :(得分:1)
DllMain
由Windows加载程序调用,同时保持一个称为“加载程序锁定”的内部关键部分,因此在DLL_PROCESS_ATTACH
事件期间将调用静态构造函数,该事件仅发生一次,当时你的DLL首次加载。
答案 2 :(得分:0)
DLL没有像EXE那样初始化,因为它们由多个进程共享。你需要的是一个单独的对象,它是你的其他对象的一次性工厂。
注意,我在这里假设“ClassA”和“ClassB”你的意思是那些类的实例......
例如,你可能会有像
这样的东西ClassA& GetTheClassAInstance();
ClassB& GetTheClassBInstsance();
第一次调用它们时,这些函数将确保正确构造ClassA和ClassB的全局实例。