Dead Lock 관련(SendMessage, WaitForSingleObject, Shared Memory)

ktlsu1231의 이미지

안녕하세요.

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)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.