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
'프로그래밍' 카테고리의 다른 글
extern 이라는 키워드에 대한 고찰 (3) | 2011.05.02 |
---|---|
COFF -> OMF (VS Import Library -> Boland Import Library) (0) | 2011.05.01 |
C++ Builder에서 OpenMP 쓰기 (1) | 2011.04.30 |
메모리 구조 (1) | 2011.02.28 |
오라클 데이터베이스 서버의 현재 시간과 날짜를 얻어오는 쿼리 (0) | 2011.02.09 |