LoadLibrary静态/全局和线程

假设我有一个具有以下静态/全局的DLL

ClassA Object; 

除了ClassA的实现之外,它还包含一个“常规”的ClassB,如果ClassA还没有被构造,这将不能正常工作(这就是为什么我使ClassA成为静态/全局的原因)。

Windows中,我相信DLL加载器会在调用ClassB的构造函数时加载这个DLL,对吗? 此时,ClassA将被build造,然后ClassB的build设将随之而来。 如果第二个线程出现并构造ClassB,ClassA将不会被构造,因为它已经被构造了。

现在,我的问题是 – 如果ClassB是由两个线程同时构build的。 所以线程1将开始构buildClassA。 在执行ClassB的构造函数之前,线程2是否等待ClassA完全构造?

换句话说,LoadLibrary()是否使用CriticalSection来确保DLL的静态/全局variables的线程安全的初始化? 我的直觉是'是',但我似乎无法find任何文件说某种方式或其他。

DllMain由Windows加载程序调用,同时持有一个称为“加载程序锁定”的内部关键段,因此您的静态构造函数将在DLL_PROCESS_ATTACH事件期间DLL_PROCESS_ATTACH ,DLL事件只会在第一次加载DLL时发生一次。

看看DllMain的文档; 我相信它谈到了加载程序锁定和初始化顺序。

因为它们被多个进程共享,DLL不像EXE那样被初始化。 你需要的是一个单一对象,它是你的其他对象的一次性工厂。

请注意,我假设这里的“ClassA”和“ClassB”是指这些类的实例…

例如,你可以有一个像

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

这些函数第一次被调用时,将确保您的ClassA和ClassB的全局实例被正确构造。