SW 개발

[win32API] DisableThreadLibraryCalls() API 설명

. . . 2011. 4. 21. 10:34
반응형
  • 출처 : 나 , http://blogs.msdn.com/larryosterman/archive/2004/06/03/147736.aspx#149344

Little known Win32 APIs: DisableThreadLibraryCalls()

DisableThreadLibraryCalls 은 시스템의 향상을위해 NT 3.5 에서추가됐다. 시스템 측정치에 따르면 다양한 약간의 page를 점유하는 system DLL 의 DllMain entrypoint에 의해서.. 대부분의 시스템이 빨라졌다. (뭔말인지? ㅡㅡ;)

이것을 쓰는 이유는 DLL의 DllMain entrypoint가 어플리케이션안에서 thread 가 생성/파괴 할때도 불리게 때문이다. ? 이것은 C runtime library 나 Winsock 같은 다중 쓰레드를 유지해야하는 DLL에서는 치명적이다. 그러나 99%의 시스템의 DLL은 DllMain / DLL_THREAD_ATTACH / DLL_THREAD_DETACH 메시지(messages)를 간단히 무시한다. dll이 DLL_THREAD_XXX messages 를 무시한다면 thread가 생성하여 DllMain entrypoint 를 호출한 경우에도 경우에도 항상 시스템은 결정짓지 못한체로 있을껏이다. (해석불가;;) 그것은 각각 증가되는 어플리 케이션의 working set 메모리안에있는 DLL 안에있는 메모리를 위한 DllMain entrypoint 를 포함하고있는 페이지때문이다.

NT 의 로더는 DisableThreadLibraryCalls 라는 API를 시스템에 추가함으로서 이 문제를 수정하였다. 어플리 케이션이 이루틴을 호출할때 그것은 시스템에게 알게 시킨다. DLL_THREAD_XXX 메시지를 신경쓰지 않는 특별한 파라미터 그리고 따라서 로더는 쓰레드의 안에있는 DLL은 생성하지 않을 것이다.

이 API는 ATL의 CAtlDllModule.DllMain() 매서드가 DisableThreadLibraryCalls()를 항상 호출할때 유용하다.? 만약 너가 DLL thread에서의 생성/소멸 메시지에 대해 불안해도 써야한다.

관련 MSDN

MSDN의 내용중에..

DLL 에서 DLL_THREAD_ATTCH 와 DLL_THREAD_DETACH 을 받지 않도록 하는 것입니다. 프로그램이 점유하는 메모리를(WORKING SET) 조금 줄일 수 있습니다. - Disables the DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for the specified dynamic-link library (DLL). This can reduce the size of the working set for some applications

위에서 나온 DLL_THREAD_ATTCH 과 DLL_THREAD_DETACH 에 대한 MSDN : http://msdn.microsoft.com/en-us/library/ms682583.aspx

반응형