Win32 에서 Mutex..... ㅠㅠ 도와주세요ㅜㅜ

yanns의 이미지

안녕하세요

KLDP에다가 wIN32관련 질문을 올리는... 게 잘못된걸 알면서도 ;; 고수님들이 계신다는 Kldp여서
염치없이 여쭤보려고 합니다.. ^^ 너그럽게 봐주시면 감사하겠습니다.

두 프로세스간 동기화를 Mutex를 통해서 해결하려고 합니다. 수도코드이니 대략적인 그림만
봐주시면 감사드리겠습니다.~

--------------------------------- Process 1 start
#define MUTEX_NAME "abcdefg"
Wmain()
{
HANDLE pMutex;
Thead pThread;
pMutex = CreateMutex(null,false,MUTEX_NAME);
if(GetLastError() == ERROR_ALREADY_EXISTS){
printf("Already created mutex\n");
}else{
printf("Newly created mutex\n");
}
WaitForSingleObject(pMutex,INFINITE);

pThread = Thread_new("Thread1", __main, pMutex);
Thread_start(pThread);
}

__main(void* pParam)
{
while (true) {
printf("Locked..\n");
WaitForSingleObject((HANDLE)pParam,INFINITE);
printf("unLocked..\n");
// Blocking Codes here
}
}

----------------- Process 1 End

여기 까지 하고 실행을 하면

Locked..

를 찍고 Wait하고 있습니다. 이렇게 짠 이유는 동일 Process 상에서 하나의 쓰레드안에 코드를 blocking해야 해서 이렇게 하였습니다. 현재 저렇게 블락이 되어 있는 mutex를 release 해야 하는데 이는 process 2 에서 이를 하려고 합니다. 코드는 다음과 같습니다~

----------------- Process 2 Start
#define MUTEX_NAME "abcdefg"
wmain()
{
HANDLE hmutex;
hmutex = OpenMutex(MUTEX_ALL_ACCESS,false,MUTEX_NAME);
if(hmutex!=null){
printf("Mutex Opened\n");
}else{
printf("No Mutex\n");
}

ReleaseMutex(hmutex);
printf("mutex Release now ....\n");
}

----------------- Process 2 end

Process 2에서는 OpenMutex를 통해서 동일한 이름으로 이미 Process1에서 생성된 이름있는 뮤텍스를 Open하여 mutex handler를 얻어 옵니다. 이를 실행하면, null 이 아닌 값을 리턴하는 것을 보면, 잘 얻어 오는걸 확인할 수 있습니다. 문제는 그 이후에 ReleaseMutex 를 하게 되면 .. Process 1에 현재 WaitForSingleObject가 풀리지 않고 있습니다 ... Process 2에서 혹시나 핸들러를 못 얻어오나 해서 WaitForSingleObject(hmutex,INFINITE); 해 보니, 역시 block이 되는 것 같습니다.

제가 알기론 win32에서 이름있는 뮤텍스는 커널 오브젝트로써 프로세스간에 동기화가 된다고 알고 있는데.. 잘 안되고 있습니다 ㅠㅠ Process 1에서 같은 쓰레드안에서 Lock을 하기 위해서 강제로 쓰레드를 만들고 그곳에서 또한번 WaitForSingleObject 한것이 혹시 원인인가 해서..Process2 에서 ReleaseMutex를 두번 해주기도 했는데.. 결과는 똑같네요 ㅠㅠ 답답할 따름입니다. ㅠㅠ

혹시 제가 빠트리고 있는게 있으면.. 고수님들의 귀중한 한말씀 부탁드리겠습니다.

그럼..
추운 날씨 조심하시구요~
굿럭~ 해요~

체스맨의 이미지

Process1 에서 스레드 만들기 전에 뮤텍에 대해 WaitForSingleObject 하고, 만들어진 스레드에서 역시 WaitForSingleObject 하므로, 만들어진 스레드는 데드락 상태입니다. 이건 로직을 잘 못 생각하신 것 같구요.

그리고, Process2 에서 Process1 의 락을 푸는 경우라면, 뮤텍이 아니라, 세마포어를 쓰셔야 할 것 같군요.

Orion Project : http://orionids.org

yanns의 이미지

흠, Process1에서 저렇게 하지 않으면, 제가 원하는 코드를 블락시킬수가 없던데요..
Process1에서 WaitForSingleObject 를 하면, Create한 process가 자기 자신이고, 오너쉽이 false이기 때문에 wait하지 않고 그냥 빠져 나갑니다. process1에서 스레드를 돌려서 뮤텍스 핸들러를 넘기고 WaitForSingleObject 하면 그 위치에서는 wait가 걸립니다.

process2에서 Release하지 않고 process1에서 release를 시도하면 wait하고 있는 싯점이 풀리면서 내려는 옵니다. 문제는 Process1에서 release 하지 않고, process2에서 핸들을 받아 release해야 하는데요....

ㅠㅠ

제가 테스트하고 있는 환경에선 현재 세마포어는 ... 지원되지 않고 있습니다 ㅠㅠ
뮤텍스만이용해야 하는데...흠 ㅠㅠ
도와주세요 고수님들~ ㅠㅠ

체스맨의 이미지

정확히 어떤 동기화 문제를 구현하는지는 모르겠지만, 아무튼...

아마 CreateSemaphore 가 없다면 낮은 버젼 CE 장치에서 작업하시는 모양이군요. 그렇다면 CreateEvent 가 있는지는 확인해보세요. producer-consumer 문제는 semaphore 가 필요합니다.

Orion Project : http://orionids.org

댓글 달기

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