2009-12-09 66 views
2

说我有,有一个DLL以下静态/全球:调用LoadLibrary静态/全局和线程

ClassA Object; 

随着ClassA的实施,还包含了“常规” ClassB的,这将无法正常工作如果ClassA尚未构造(这就是为什么我使ClassA成为静态/全局的原因)。

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

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

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

回答

1

DllMain由Windows加载程序在保持称为“加载程序锁定”的内部关键段的情况下调用,因此您的静态构造函数将在第一次加载DLL时发生的DLL_PROCESS_ATTACH事件中调用。

+0

谢谢 - 这与我解释DllMain文档暗示的内容一致,但我很欣慰地发现别人与我的解释一致。 – 2009-12-28 05:00:32

1

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

0

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

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

例如,你可以有一个像

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

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