2011. 5. 1. 21:17


C++ Builder에서 OpenMP 사용을 하기 위해 Visual Studio에서 OpenMP 라이브러리를 사용하는 dll을 만들었다.

LoadLibrary()를 사용하여 dll 파일을 로드하고 사용하다가 문득 DllMain()이 생각났다. 그 순간 난 번뜩(아 씨발..) 재수없으면 이거 교착(Dead lock)에 빠지것는데...

그리하여 오늘은 DllMain()이 어떤 녀석인지.. 그리고 어떤 순서로 동작을 하는지 또 무엇이 문제이길래 필자가 욕까지 했는지 끄적거려보겠다. 사실 인터넷에 찾아보면 DllMain()에 대해 잘 나온 문서들이 많다. 난 그런 문서들과 내 머리속 지식을 조합해서 아주 간단하게 호출시기와 문제점, DllMain()을 정의 할 때 절대 하지 말아야 할 행동에 대해 글을 쓰겠다.

호출 시기.

1. DLL이 어떤 프로세스의 주소 공간에 최초로 매핑이 되었을때(DLL_PROCESS_ATTACH)
2. DLL이 어떤 프로세스의 주소 공간으로부터 해제되었을때(DLL_PROCESS_DETACH)
3. 어떤 프로세스 내에서 스레드가 생성될 때 해당 프로세스 주소공간에 매핑 되어있는 모든 DLL의 파일 이미지를 검사할 때
   간단하게 스레드가 생성 될때 - (DLL_THREAD_ATTACH)
4. 스레드가 종료 되면서 리턴 될때(ExitThread()가 호출될때)
   간단하게 스레드가 종료 될때 - (DLL_THREAD_DETACH)

문제점.

만약 DllMain()을 정의하게 되면 꼭 짚고 넘어가야 할 부분이 있는데 바로 1(DLL_PROCESS_ATTACH)번과 3(DLL_THREAD_ATTACH)번이다. DllMain()이 호출되어서 DLL_PROCESS_ATTACH 상황일 때 만약 스레드를 생성한다면 DLL_THREAD_ATTACH이 녀석이 또 호출 될 것이다. 바로 교착(Dead lock)상황이 발생하게 된다.

이 상황을 적절하게 표현한 소스가 있는 페이지. 참고 할 것.
http://blog.naver.com/uleena?Redirect=Log&logNo=80043960362


DllMain()을 정의 할 때 절대 하지 말아야 할 행동 글을 쓰기가 귀찮으니 사진과 링크로 참고하겠다.


참고 : http://greenfishblog.tistory.com/21

Posted by 뿌직