본문 바로가기

Windows/MFC

WaitForSingleObject 함수 와 WaitForMultipleObject 함수

WaitForSingleObject 함수 와 WaitForMultipleObject 함수

하나의 커널 객체가 시그널되기를 대기할 때는 WaitForSigleObject 함수를 사용할 수 있다.

[code]DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);[/code]

hHandle : 커널 객체를 나타낸다.
dwMilliseconds : 지정한 객체가 시그널 되지 않을 경우에 이 함수가 리턴해야 되는 시간 초과 간격을 ms 단위로 지정한다. 무한히 시그널 되기를 기다리기 위해서 INIFINITE 를 사용한다.

리턴값
WAIT_FAILED : 대기 동작이 실패했단느 것을 나타낸다. GetLastError 함수를 이용하면 실패한 이유에 대한 자세한 정보를 얻을 수 있다.
WAIT_OBJECT_0 : 커널 객체가 주어진 시간 간격 안에 시그널 된 상태로 변했다.
WAIT_TIMEOUT : 커널 객체가 시그널 되기 전에 주어진 시간 초과 간격이 모두 지났다.
WAIT_ABANDONED_0 : 커널 객체가 뮤텍스를 사용했고, 뮤텍스를 소유한 스레드가 자발적으로 뮤텍스의 소유권을 해제하지 않고 종료하거나 종료되었다.


EXAMPLE

#define NUM_OBJECTS 2

DWORD dwWaitResult;
HANDLE hObjets[NUM_OBJECTS];

// 대기하고 있을 커널의 객체들의 핸들 표를 초기화
hObjects[0] = hThreadExitEvent;
hObjects[1] = hResourceMutex;

// 다음중 하나가 발생될 때까지 계속해서 대기한다.
// (1) 종료명령을 받았고 다른 스레드가 수동 리셋 이벤트를 시그널 함 으로서 알려진 경우
// (2) 이 스레드가 작업을 하기 위해서 필요한 자원이 사용 가능한 경우
// (hResourceMutex)

dwWaitResult = WaitForMultipleObjects(NUM_OBJECTS, hObjects, FALSE, INFINITE);

// 리턴한 이유를 판단한다.
if ((dwWaitResult >= WAIT_OBJECT_0) &&
    (dwWaitResult <= WAIT_OBJECT_0) + NUM_OBJECTS - 1)
{
    // 리턴값이 객체중 하나가 시그널 된 것을 나타내는 범위에 있는 경우이다.
    // 이제 이 객체가 스레드 종료 이벤트인지 자원 뮤텍스 인지를 판단하자.

    switch (dwWaitResult - WAIT_OBJECT_0)
    {
    case 0:
        // hThreadExitEvent 에 의해 참조되는 이벤트가 시그널 되었다.
        // 이 스레드를 종료할 필요가 있는 경우

        break;
    
    case 1:
        // hResourceMutex에 희해 참조되는 뮤텍스가 이 스레드에 의해서 소유
        // 되었고 이 스레드가 새로운 작업을 할 수 있게된 경우
        break;
    }
}
else
{
    // 대기 실패시 처리
    // 일반적인 실패 (WAIT_FAILED, WAIT_TIMEOUT)
    // 뮤텍스 포기 (WAIT_ABANDONED_0) 인지 분석
}