3. Implementation/Windows API

WAIT_ABANDONED_0 에 대해서..

SSKK 2008. 8. 27. 21:15
공유메모리를 이용하여 프로세스간 데이터 통신을 갖추었다.

1. A, B 프로세스간에 공유하는 메모리를 생성하고
2. 그 메모리에 대한 공통의 뷰를 생성
3. 그리고 동기화를 위한 뮤텍스와 이벤트 등등
4. 그리고 데이터의 동기화를 위한 프로세스 내부 큐를 생성

위와같은 기능을 하는 동기화 클래스를 만들었다.

이때, 동기화를 위해서 각 프로세스간에 이름있는(Named) 뮤텍스를 가지고 있는데,

이때 다음과 같은 문제점이 발생하였다.

A라는 프로세스는 공유메모리를 읽기 모드로 열어서 B 프로세스가 보내는 데이터를 수신하고 있다.

B 프로세스는 공유메모리를 쓰기모드로 오픈하여 데이터를 송신하기로 했다.
근데 B 프로세스에서 약간의 디버깅을 하다가 약간의 코드가 추가되었는데, (삽질)

// 대략적인 거라 문법은 무시하자.
// 일단 쓰레드를 생성하고 쓰레드 내에서 공유메모리 객체를 연다는 의미이다.

void a()
{
    CreateThread(ThreadProc)
}

void ThreadProc()
{
    ShreadMemory.Open()
    return 0;
}


와 같이 임시 쓰레드를 생성한 후 쓰레드내에서 공유메모리 객체를 오픈하였는데, 이 공유메모리 객체 내부에서 뮤텍스를 생성한다.

이때, 공유메모리 객체를 읽기 모드로 WaitFor 계열 함수로 대기하고 있는 A 프로세스에서

WAIT_ABANDONED_0

가 발생하였다. ABANDONED의 사전적 뜻은 "버림받은, 유기된"의 뜻으로 생성된 뮤텍스가 버림받았다고?

생각컨데, 뮤텍스를 생성한 쓰레드가 종료되는 순간 그 뮤텍스를 Close 하는 것과는 별개로 쓰레드 컨텍스트가 사라지는 순간 그 뮤텍스 자체도 ABANDONED 되어 버리는 것 같다.


지금껏 WaitFor 게열 함수를 사용할때 WAIT_OBJECT_0 + n 매크로와 WAIT_TIMEOUT 정도만 고려해서 작성하였는데 실제로 WAIT_ABANDONED_0도 고려해서 설계를 해야 된다는 것을 느꼈다.


Keyword :
WaitForSingleObject; WaitForMultipleObjects; Mutex; Event; Thread; Semaphore;