WaitOnAddress 함수(synchapi.h)

지정된 주소의 값이 변경될 때까지 기다립니다.

구문

BOOL WaitOnAddress(
  [in]           volatile VOID *Address,
  [in]           PVOID         CompareAddress,
  [in]           SIZE_T        AddressSize,
  [in, optional] DWORD         dwMilliseconds
);

매개 변수

[in] Address

대기할 주소입니다. Address의 값이 CompareAddress의 값과 다른 경우 함수는 즉시 반환됩니다. 값이 같으면 동일한 프로세스의 다른 스레드가 WakeByAddressSingle 또는 WakeByAddressAll 또는 시간 제한 경과를 호출하여 Address의 값이 변경되었음을 알리는 신호가 올 때까지 함수가 반환되지 않습니다.

[in] CompareAddress

Address에서 이전에 관찰된 값의 위치에 대한 포인터입니다. 이 함수는 Address 의 값이 CompareAddress의 값과 다를 때 를 반환합니다.

[in] AddressSize

값의 크기(바이트)입니다. 이 매개 변수는 , , 42또는 81수 있습니다.

[in, optional] dwMilliseconds

작업 시간이 초과되기 전에 대기할 시간(밀리초)입니다. 이 매개 변수가 INFINITE이면 스레드가 무기한 대기합니다.

반환 값

TRUE 대기가 성공하면 입니다. 작업이 실패하면 함수는 를 반환합니다 FALSE. 대기가 실패하면 GetLastError 를 호출하여 확장된 오류 정보를 가져옵니다. 특히 작업 시간이 초과되면 GetLastError는ERROR_TIMEOUT 반환합니다.

설명

Microsoft Store 앱 개발자는 SDK(Windows SDK(소프트웨어 개발 키트))를 설치하여 가져와 synchronization.lib 야 할 수 있습니다.

WaitOnAddress 함수는 스레드에서 특정 값이 원치 않는 값에서 다른 값으로 변경될 때까지 기다리는 데 사용할 수 있습니다. WaitOnAddress는 스레드 스케줄러를 while 방해하지 않으므로 루프 내에서 절전 모드 함수를 사용하는 것보다 WaitOnAddress가 더 효율적입니다. 또한 WaitOnAddress 는 이벤트를 만들고 초기화한 다음 값과 올바르게 동기화할 필요가 없으므로 이벤트 개체보다 사용하기가 더 간단합니다. WaitOnAddress 는 메모리 부족 상태의 영향을 받지 않으며, 아래에 언급된 대로 스레드를 일찍 깨울 가능성이 있습니다.

스레드가 대기 중인 주소의 값을 변경하는 동일한 프로세스 내의 모든 스레드는 WakeByAddressSingle 을 호출하여 대기 중인 단일 스레드를 절전 모드 해제하거나 WakeByAddressAll 을 호출하여 모든 대기 스레드를 절전 모드 해제해야 합니다. WakeByAddressSingle이 호출되면 다른 대기 스레드는 계속 대기합니다.

참고:WaitOnAddress 는 주소가 신호를 받으면 반환되도록 보장되지만 다른 이유로 반환할 수도 있습니다. 이러한 이유로 WaitOnAddress 가 반환된 후 호출자는 새 값을 원래 원치 않는 값과 비교하여 값이 실제로 변경되었는지 확인해야 합니다. 예를 들어 다음과 같은 경우 스레드를 일찍 해제할 수 있습니다.
  • 메모리 부족 상태
  • 동일한 주소의 이전 절전 모드 해제가 중단되었습니다.
  • 운영 체제의 확인된 빌드에서 코드 실행
 

예제

다음 예제에서는 WaitOnAddress를 사용하는 방법을 보여줍니다.

ULONG g_TargetValue; // global, accessible to all threads
ULONG CapturedValue;
ULONG UndesiredValue;

UndesiredValue = 0;
CapturedValue = g_TargetValue;
while (CapturedValue == UndesiredValue) {
      WaitOnAddress(&g_TargetValue, &UndesiredValue, sizeof(ULONG), INFINITE);
      CapturedValue = g_TargetValue;
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8 [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2012 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 synchapi.h(Windows.h 포함)
라이브러리 Synchronization.lib
DLL API-MS-Win-Core-Synch-l1-2-0.dll

추가 정보

WakeByAddressAll

WakeByAddressSingle

VBS Enclave에서 사용할 수 있는 Vertdll API