[완료]SendMessege와 콜백함수의 관계에 대해서 질문드립니다.
얼마전 테스트를 해봤는데, 아래와 같은 현상을 발견했습니다.
현상: 신호가 처리되는 콜백함수 부분이 리턴되기 전까지는 다른 쓰레드에서 호출한 SendMessage는 계속 대기하게 됩니다.
(Enter는 EnterCriticalSection을 의미합니다.)
주스레드의 콜백함수 임계구역대기중... (작업자 쓰레드가 진입한 상태.)
CALLBACK 루틴 { case WM_COMMAND: ... Enter{ Leave} return... }
작업스레드(임의생성) 임계구역 먼저 진입 -> SendMessege() 함수에서 블록 걸립니다.(위에서 콜백루틴이 실행중)
DWORD 쓰레드 { Enter{ SendMessege() Leave} ... }
쉽게말해서 콜백함수가 실행중일때는, 각기 다른 쓰레드 환경에서 SendMessege을 호출하면 블록킹이 걸립니다.
(콜백함수가 리턴되면 SendMessege가 그제서야 실행되어지더군요.)
단, 동기화시 같은 쓰레드에서 Enter를 두번 호출하면 이후에 호출된 Enter는 무시되기 때문에,
같은 쓰레드에서 둘다 호출할때는 블록킹이 안걸리네요.
결국 위에서 예제에 나온 형태가 나올때는 데드락이 걸리게되더군요.
요약하면 콜백함수에 EnterCriticalSection을 배치한 상태에서,
다른 쓰레드에 EnterCriticalSection를 배치하고 임계구역 내부에 SendMessege를 배치하는 것은 잠재적인
데드락을 유발하는 요소로 작용할 수 있다는 것입니다.
제가 질문드리고자 하는 사항은 다음과 같습니다.
1.SendMessege간에 자체적으로 동기화가 이루어지는건가요?
2.SendMessege와 콜백함수간에 자체적이로 동기화가 이루어지나요?
즐거운 하루 되세요.
아래 글을 먼저 참고
아래 글을 먼저 참고 하시기 바랍니다.
http://msdn.microsoft.com/en-us/library/ms644927(v=VS.85).aspx#deadlocks
SendMessage를 꼭 사용해야 하는 이유가 어떤 처리의 결과를 알기 위한 것인가요? 쓰레드 양쪽의 PostMessage 를 주고 받음으로 대체할 수 있습니다. 아니라면 SendMessageTimeout 정도를 도입해야 할 것입니다. SendMessage를 그대로 사용해야 한다면, InSendMessage를 이용해서 SM으로 보내진 것인지 확인하고 ReplyMessage로 리턴값을 빠르게 돌려주는 것이 가능한 경우도 있겠습니다.
아마 Advanced Programming Windows (제프리 아저씨 책) 한 챕터에서 이 문제를 집중적으로 다뤘던 걸로 기억하고 있습니다.
덕분에 해결했습니다.
답변 정말 감사드립니다!
댓글 달기