[완료]SendMessege와 콜백함수의 관계에 대해서 질문드립니다.

richjaff의 이미지

얼마전 테스트를 해봤는데, 아래와 같은 현상을 발견했습니다.

현상: 신호가 처리되는 콜백함수 부분이 리턴되기 전까지는 다른 쓰레드에서 호출한 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와 콜백함수간에 자체적이로 동기화가 이루어지나요?

즐거운 하루 되세요.

bugiii의 이미지

아래 글을 먼저 참고 하시기 바랍니다.

http://msdn.microsoft.com/en-us/library/ms644927(v=VS.85).aspx#deadlocks

SendMessage를 꼭 사용해야 하는 이유가 어떤 처리의 결과를 알기 위한 것인가요? 쓰레드 양쪽의 PostMessage 를 주고 받음으로 대체할 수 있습니다. 아니라면 SendMessageTimeout 정도를 도입해야 할 것입니다. SendMessage를 그대로 사용해야 한다면, InSendMessage를 이용해서 SM으로 보내진 것인지 확인하고 ReplyMessage로 리턴값을 빠르게 돌려주는 것이 가능한 경우도 있겠습니다.

아마 Advanced Programming Windows (제프리 아저씨 책) 한 챕터에서 이 문제를 집중적으로 다뤘던 걸로 기억하고 있습니다.

richjaff의 이미지

답변 정말 감사드립니다!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.