2009-12-09 79 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的全局實例被正確構建。