LoadLibrary静态/全局和线程

时间:2009-12-09 17:36:01

标签: windows dll thread-safety loadlibrary

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

ClassA Object;

随着ClassA的实现,它还包含一个'常规'ClassB,如果还没有构造ClassA,它将无法正常工作(这就是我使ClassA成为静态/全局的原因)。

在Windows中,我相信DLL加载器会在调用ClassB的构造函数时加载此DLL,对吗?此时,将构建ClassA,然后将遵循ClassB的构造。如果第二个线程出现并构造ClassB,则不会构造ClassA,因为它已经构造了。

现在,我的问题是 - 如果ClassB由两个线程同时构建,该怎么办?因此,线程1将开始构建ClassA。在执行ClassB的构造函数之前,线程2是否会等到ClassA完全构造?

换句话说,LoadLibrary()是否使用CriticalSection来确保DLL的静态/全局变量的线程安全初始化?我的预感是'是',但我似乎找不到任何文件说这种或那种方式。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

DllMain由Windows加载程序调用,同时保持一个称为“加载程序锁定”的内部关键部分,因此在DLL_PROCESS_ATTACH事件期间将调用静态构造函数,该事件仅发生一次,当时你的DLL首次加载。

答案 2 :(得分:0)

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

注意,我在这里假设“ClassA”和“ClassB”你的意思是那些类的实例......

例如,你可能会有像

这样的东西
ClassA& GetTheClassAInstance();
ClassB& GetTheClassBInstsance();

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