WaitForSingleObject

고 연우·2022년 9월 23일
0

C++

목록 보기
1/4
  • 지정된 개체가 신호를 받은 상태가 되거나 시간 제한 간격이 경과할 때까지 기다림
  • 지정된 개체의 현재 상태를 확인 -> 개체의 상태가 신호가 없는 경우 -> 호출 스레드는 개체가 신호를 받거나 시간 제한 간격이 경과할 때까지 대기 상태에 들어감
  • 경고 가능한 대기 상태를 입력하려면 WaitForSingleObjectEx 함수를, 여러 객체를 기다리려면 WaitForMultipleObjects 를 사용

Syntax

DWORD WaitForSingleObject(
  [in] HANDLE hHandle,
  [in] DWORD  dwMilliseconds
);

hHandle
개체에 대한 핸들

  • 대기가 아직 보류 중인 동안 이 핸들이 닫히면 함수의 동작이 정의되지 않음( 오류가 발생한다는 의미 인 듯. 이 함수를 호출한 부분이나 호출당한 부분에서 행이 걸리거나... )
  • 핸들에는 SYNCHRONIZE(동기화) 액세스 권한 필요
    • 이것도 스레드 개념이니까..?
  • WaitForSingleObject API 끝난 후 CloseHandle( hHandle ); 호출해줘서 핸들 닫기!

dwMilliseconds
타임아웃 시간

  • INFINITE 이면 객체가 신호를 받을 때만 함수가 반환
    • 신호를 받을 때 까지 무한정 대기

Return

  • 실패 시, WAIT_FAILED( (DWORD)0xFFFFFFFF ) 리턴
    • 확장된 오류 정보를 얻으려면 GetLastError() 를 호출
  • 성공 시
    • WAIT_ABANDONED : 지정된 오브젝트는 파기 되어진 뮤텍스 오브젝트 였다. 이 뮤텍스 오브젝트를 소유한 스레드가 뮤텍스 오브젝트의 소유권을 풀어주지 않고 종료했다. 그래서 그 뮤텍스 오브젝트의 소유권이 호출한 쪽 스레드로 옮겨져 그 뮤텍스는 비시그널 상태로 설정되었다.
      • 이 경우, ResetEvent( hHandle ) 호출하여 해당 개체에 대한 핸들을 reset 하고 다시 WaitForSingleObject() 호출
    • WAIT_OBJECT_0 : Event가 신호(Signal) 상태가 됨( 대표적으로 성공을 리턴했다고 봐야할 듯 )
    • WAIT_TIMEOUT : 타임아웃 시간이 경과할 때까지 시그널 생태가 되지 않음.

기타

  • CreateEvent(), SetEvent(), ResetEvent() 와 함께 쓰일 수 있는 듯
  • CreateProcess() 호출한 후에도 쓰일 수 있음. 아마도

참고

0개의 댓글