Dead Lock 관련(SendMessage, WaitForSingleObject, Shared Memory)
안녕하세요.
Shared Memory를 사용하는 구조입니다.
Client <----------------Shared Memory----------------> Server
SendMessage(Alive?) <--> SendMessage(Alive?)
형태로 되어 있고, 서로 메모리를 공유하기 위해 살아있는지 확인하는 과정을 거치는데
아래와 같은 형태로 서버측에서 클라이언트 측으로 명령을 실행하기 전 살아있는지
SendMessage 처리를 합니다. 클라이언트 핸들은 공유메모리에 기록되어 있는 것을
가져온 것이고 공유메모리에 있는 m_bAlive 변수에 True, False 값을 주어 상대가
살아있는지 확인합니다.
WaitForSingleObject(m_hMutex, 1000);
SendMessage(hClientWnd, WM_AREYOUTHERE, i, 0);
if (pTable->m_ok[i].m_bAlive == TRUE){
...Logic...
}
ReleaseMutex(m_hMutex);
이런 구조에서 Dead Lock에 빠질 수 있을까요?
원인 모를 멈춤이 가끔있는데 이 부분이 의심이 가서요.
분명 Client 쪽에서도 서버와 같은 구조로 SendMessage를 받으면 이벤트가 발생되어
pTable->m_ok[i].m_bAlive에 값을 넣어주어야 하여 m_hMutex 쪽을 건드려야 합니다.
WaitForSingleObject(m_hMutex, 1000);
SendMessage(hClientWnd, WM_AREYOUTHERE, i, 0);
if (pTable->m_ok[i].m_bAlive == TRUE){
...Logic...
}
ReleaseMutex(m_hMutex);
SendMessage에 따라 클라이언트에 메시지가 도착하면 아래와 같은 펑션이 실행됩니다.
여기에는 WaitForSingleObject() 등의 안전장치는 되어있지 않습니다.
void IAmHere(int theClientIndex)
{
XTTABLE* pTable = (XTTABLE*)*shrMem;
pTable->m_ok[theClientIndex].m_bAlive = TRUE;
}
Logic으로 표현한 부분에 대해서는 공유 메모리에 값을 써넣는 과정을 거칩니다.
감사합니다.
원하시는 답이 이게 맞는진 모르겠지만..
SendMessage 자체가 블락이라서 그럴겁니다.
그래서 보통은 SendMessage로 IPC할 경우 메세지를 받은 윈도우에서는 처리하지 않고 PostMessage로 인자를 그대로 다시 넘겨 처리합니다. (PostMessage는 non-block)
댓글 달기