轉自:CSDN 微軟 陳本峰 http://blog.csdn.net/WinGeek/ 文章鏈接:http://blog.csdn.net/WinGeek/archive/2009/06/01/4230741.aspx DLL 里面使用TLS (Local Thread Storage) 的常見做法是:在DLLMain的DLL_PROCESS_ATTACH/DLL_THREAD_ATTACH 被調用的時候為每個線程(Thread)分配內存,而在DLL_THREAD_DETACH/DLL_PROCESS_DETACH 被調用的時候釋放內存。 MSDN文章《Using Thread Local Storage in a Dynamic-Link Library》 上有這樣的示例代碼。 BOOL WINAPI DllMain(HINSTANCE hinstDLL, // DLL module handle ??? switch (fdwReason)
實驗代碼: typedef void (__stdcall *FNSLEEP)(); void CallTestDLL() DWORD WINAPI ThreadProc( LPVOID lpParam) g_hDLLModule = ::LoadLibrary(_T("TestDLL.dll")); 輸出結果1: [Thread 4976] DLL_PROCESS_ATTACH??????????????? //主線程 以上輸入結果我們看到每個Thread 調用DLL函數DoSleep 立即結束,這時候DLL_THREAD_DETACH 被正常調用。 這時只要候稍微改一下代碼,會看到完全不同的結果。 DWORD WINAPI ThreadProc( LPVOID lpParam) ??? DoSomethingElse(); // 延遲線程結束
[Thread 7448] DLL_PROCESS_ATTACH????????????? //主線程
結論: 如果是線程在DLL被卸載(調用FreeLibrary) 之前結束,則DLL_THREAD_DETACH 會被調用。 如果線程在DLL卸載之后結束,則DLL_THREAD_DETACH 不會被調用。 |
DLL_THREAD_DETACH 認識誤區
2009-06-01 22:20
只有注冊用戶登錄后才能發表評論。 | ||
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
![]() |
||
相關文章:
|
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|