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) 인지 분석
}
하나의 커널 객체가 시그널되기를 대기할 때는 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) 인지 분석
}
'Windows > MFC' 카테고리의 다른 글
[thread] 세마포어를 이용한 스레드 동기화 (0) | 2013.10.02 |
---|---|
Mutex를 이용한 스레드 동기화 (0) | 2013.10.02 |
대기 하는데 사용할 수 있는 커널 객체 (0) | 2013.10.02 |
[thread] Critical Section 임계영역 (0) | 2013.10.02 |
[thread] Interlocked (0) | 2013.10.02 |