본문 바로가기

윈도우/System Programming

WaitForSingleObject , WaitForMultipleObject

WaitForSingleObject , WaitForMultipleObject

 

 

 

WaitForSingleObject

 

DWORD WaitForSingleObject(
HANDLE hHandle,                        // handle to object
DWORD dwMilliseconds               // time-out interval
);
실패시 WAIT_FAILED 리턴

- HhANDLE :  상태를 확인할 커널 오브젝트의 핸들을 전달.
                  이 핸들의 커널 오브젝트 상태가 signaled가 되어야 리턴한다.
                  non-signaled상태에 있을 경우 함수는 리턴하지 않고 대기상태로 들어간다.

- dwMilliseconds : 타임아웃을 설정한다. 커널오브젝트가 singnaled 상태로 바뀌지 않을 경우 무한대기 상태로 빠질수 있다.
                         그러나 타임아웃을 설정해 놓으면 그 시간이 지나서 바로 리턴하게 된다.
                         1/1000초 단위로 설정한다. 만약 INFINITE를 전달할 경우 signaled 상태가 되기 전에는 리턴하지 않는다.

- return value : 커널 오브젝트가 이벤트 발생으로 인해, signaled 상태가 되어 리턴하는 경우에는
                   WAIT_OBJECT_O를 리턴한다. 만약에 타임아웃이 되어서 리턴하는 경우에는 WAIT_TIMEOUT을 리턴한다.
                   성공적으로 함수를 리턴하는 경우(이벤트 발생에 의해, 커널 오브젝트가 SIGNALED 상태가 되어 리턴하는 경우)
                   커널 오브젝트를 non-signaled 상태로 되돌린다. (이는 auto-reset일 경우만 해당)

 

 

 

 

WaitForMultipleObject

 

WaitForMultipleObjects는 뜻 그대로 여러개의 object handle이 지정된 상태나 일정 시간이 지날때까지 기다리는 함수이다. 예를들면 복수개의 thread가 모두 종료되기를 기다릴 때 사용할 수 있다. 사용방법은 다음과 같다.


DWORD WINAPI WaitForMultipleObjects(

 DWORD            nCount,

 const HANDLE*  lpHandles,

 BOOL                bWaitAll,

 DWORD              dwMilliSeconds );

 

 

  - nCount : lpHandles에 들어있는 object handle의 갯수이다. 최대 MAXIMUM_WAIT_OBJECTS (64개)만을 지정할 수 있다.
  - lpHandles : 함수가 기다릴 object handle의 배열이다. 이 배열은 서로 다른 종류의 obejct의 handle들이 들어갈 수 있다.(배열의 주소정보)
  - bWaitAll : TRUE이면 lpHandles의 모든 handle의 signal을 기다리고, TRUE이면 하나라도 signal이 오면 리턴된다. 후자의 경우 리턴값은 signal을 준 object가 된다.
  - dwMilliSeconds : bWaitAll에 의한 조건이 만족되지 않더라도 이 값에 의한 시간이 흐르면 함수는 리턴된다. 0이라면 즉시 리턴되고, INFINITE이면 무한정 기다린다.

 

 

 

커널 오브젝트의 상태

 

커널 오브젝트의 상태를 저장하기 위해서 커널 오브젝트를 구성하는 멤버 변수 중에 상태정보를 담당하는 변수가 있다.

 

Signaled 이면 TRUE 값,  Non-Signaled 이면 FALSE 값을 전달하게 됩니다.

 

 

프로세스가 생성될때

 

커널 오브젝트도 생성되는데 이때 커널 오브젝트의 상태는 Non-Signaled (FALSE)

프로세스가 종료되면 커널 오브젝트의 상태 정보가 Signaled(TRUE)

 

로 바뀜

 

예를 들어 프로세스 커널 오브젝트는 프로세스 실행중에는 Non-Signaled 상태에 놓인다. 그러다가 프로세스

가 종료되면 Windows운영체제에 의해서 자동적으로 Signaled상태가 된다.

 

그러나 (Signaled => Non-Signaled ) 상태변화는 불가합니다.

 

이유는 한번 종료된 프로세스는 다시 살릴수 없기때문에 또다시 프로세스를 생성하는 방법밖에 없다는  것을 알아야 한다.

 

ex)

계산기를 열고 닫았다. 그리고 또다시 계산기를 열었다. 계산기라는 같은 프로그램이지만 우리는 다른 프로세스를 만들고 있는것이다.

 

 

 

마지막으로 다시 정리하면

 

프로세스의 커널 오브젝트는 생성과 동시에 Non-Signaled 상태가 된다. 다라서 부모 프로세스가

 

WaitForSingleObject 함수를 호출하면 이 함수는 블로킹(Blocking)상태에 놓인다.

 

즉 부모 프로세스는 더 이 행하지 않고 함수의 블로킹 상태에서 빠져 나오기만을 기다리는 것이다.