다음을 통해 공유


SignalObjectAndWait 함수(synchapi.h)

한 개체에 신호를 전송하고 다른 개체를 단일 작업으로 기다립니다.

구문

DWORD SignalObjectAndWait(
  [in] HANDLE hObjectToSignal,
  [in] HANDLE hObjectToWaitOn,
  [in] DWORD  dwMilliseconds,
  [in] BOOL   bAlertable
);

매개 변수

[in] hObjectToSignal

신호를 받을 개체에 대한 핸들입니다. 이 개체는 세마포, 뮤텍스 또는 이벤트일 수 있습니다.

핸들이 세마포인 경우 SEMAPHORE_MODIFY_STATE 액세스 권한이 필요합니다. 핸들이 이벤트인 경우 EVENT_MODIFY_STATE 액세스 권한이 필요합니다. 핸들이 뮤텍스이고 호출자가 뮤텍스를 소유하지 않는 경우 함수는 ERROR_NOT_OWNER 함께 실패합니다.

[in] hObjectToWaitOn

대기할 개체에 대한 핸들입니다. SYNCHRONIZE 액세스 권한이 필요합니다. 자세한 내용은 동기화 개체 보안 및 액세스 권한을 참조하세요. 핸들을 지정할 수 있는 개체 형식 목록은 주의 섹션을 참조하세요.

[in] dwMilliseconds

제한 시간 간격(밀리초)입니다. 함수는 개체의 상태가 서명되지 않고 완료 또는 APC(비동기 프로시저 호출) 개체가 큐에 대기되지 않은 경우에도 간격이 경과하면 를 반환합니다. dwMilliseconds가 0이면 함수는 개체의 상태를 테스트하고 대기 중인 완료 루틴 또는 APC를 확인하고 즉시 반환합니다. dwMillisecondsINFINITE이면 함수의 제한 시간 간격이 경과하지 않습니다.

[in] bAlertable

이 매개 변수가 TRUE이면 시스템이 I/O 완료 루틴 또는 APC 함수를 큐에 대기하고 스레드가 함수를 호출할 때 함수가 반환됩니다. FALSE이면 함수가 반환되지 않고 스레드가 완료 루틴 또는 APC 함수를 호출하지 않습니다.

APC를 큐에 넣은 함수 호출이 완료되면 완료 루틴이 큐에 대기됩니다. 이 함수는 를 반환하고 완료 루틴은 bAlertableTRUE이고 호출 스레드가 APC를 큐에 대기시킨 스레드인 경우에만 호출됩니다.

반환 값

함수가 성공하면 반환 값은 함수가 반환되도록 한 이벤트를 나타냅니다. 다음 값 중 하나일 수 있습니다.

반환 코드/값 설명
WAIT_ABANDONED
0x00000080L
지정된 개체는 소유 스레드가 종료되기 전에 뮤텍스 개체를 소유한 스레드에서 해제되지 않은 뮤텍스 개체입니다. 뮤텍스 개체의 소유권은 호출 스레드에 부여되고 뮤텍스는 비사인으로 설정됩니다.

뮤텍스가 영구 상태 정보를 보호하는 경우 일관성을 위해 검사 합니다.

WAIT_IO_COMPLETION
0x000000C0L
스레드에 큐에 대기 중인 하나 이상의 사용자 모드 APC( 비동기 프로시저 호출 )로 대기가 종료되었습니다.
WAIT_OBJECT_0
0x00000000L
지정된 개체의 상태가 신호를 보냅니다.
WAIT_TIMEOUT
0x00000102L
시간 제한 간격이 경과하고 개체의 상태는 서명되지 않습니다.
WAIT_FAILED
(DWORD)0xFFFFFFFF
함수가 실패했습니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

설명

SignalObjectAndWait 함수는 SetEventWaitForSingleObject와 같은 별도의 함수 호출에 비해 한 개체에 신호를 보냅니다.

SignalObjectAndWait 함수는 다음 개체를 기다릴 수 있습니다.

  • 변경 알림
  • 콘솔 입력
  • 이벤트
  • 메모리 리소스 알림
  • Mutex
  • 프로세스
  • 세마포
  • 스레드
  • 대기 가능한 타이머
자세한 내용은 동기화 개체를 참조하세요.

스레드는 SignalObjectAndWait 함수를 사용하여 작업자 스레드가 개체에 신호를 전송하기 전에 대기 상태인지 확인할 수 있습니다. 예를 들어 스레드와 작업자 스레드는 핸들을 사용하여 작업을 동기화하는 이벤트 개체를 사용할 수 있습니다. 스레드는 다음과 같은 코드를 실행합니다.

  dwRet = WaitForSingleObject(hEventWorkerDone, INFINITE);
  if( WAIT_OBJECT_0 == dwRet)
    SetEvent(hEventMoreWorkToDo);

작업자 스레드는 다음과 같은 코드를 실행합니다.

  dwRet = SignalObjectAndWait(hEventWorkerDone,
                              hEventMoreWorkToDo,
                              INFINITE, 
                              FALSE);

"신호" 및 "대기"는 원자성 연산으로 수행되도록 보장되지 않습니다. 다른 프로세서에서 실행되는 스레드는 SignalObjectAndWait 을 호출하는 스레드가 두 번째 개체에서 대기를 시작하기 전에 첫 번째 개체의 신호 상태를 관찰할 수 있습니다.

여러 스레드 간에 이러한 API를 사용하면 애플리케이션이 교착 상태가 될 수 있으므로 Windows 7에서 SignalObjectAndWaitPulseEvent 를 사용할 때는 매우 주의해야 합니다. SignalObjectAndWait에서 신호를 받는 스레드는 PulseEvent를 호출하여 SignalObjectAndWait 호출의 대기 개체에 신호를 보냅니다. 경우에 따라 SignalObjectAndWait 의 호출자가 대기 중인 개체의 신호 상태를 수신할 수 없어 교착 상태가 발생합니다.

직접 또는 간접적으로 창을 만드는 대기 함수 및 코드를 사용할 때는 주의해야 합니다. 스레드가 창을 만드는 경우 메시지를 처리해야 합니다. 메시지 브로드캐스트는 시스템의 모든 창으로 전송됩니다. 시간 제한 간격 없이 대기 함수를 사용하는 스레드는 시스템이 교착 상태가 될 수 있습니다. 간접적으로 창을 만드는 코드의 두 가지 예는 DDE 및 COM CoInitialize입니다. 따라서 창을 만드는 스레드가 있는 경우 다른 스레드에서 SignalObjectAndWait 을 호출해야 합니다. 이것이 불가능한 경우 MsgWaitForMultipleObjects 또는 MsgWaitForMultipleObjectsEx를 사용할 수 있지만 기능은 동일하지 않습니다.

이 함수를 사용하는 애플리케이션을 컴파일하려면 _WIN32_WINNT 0x0400 이상으로 정의합니다. 자세한 내용은 Windows 헤더 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 synchapi.h(Windows.h 포함)
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

MsgWaitForMultipleObjects

MsgWaitForMultipleObjectsEx

동기화 함수

대기 함수