Функция WaitOnAddress (synchapi.h)
Ожидает изменения значения по указанному адресу.
Синтаксис
BOOL WaitOnAddress(
[in] volatile VOID *Address,
[in] PVOID CompareAddress,
[in] SIZE_T AddressSize,
[in, optional] DWORD dwMilliseconds
);
Параметры
[in] Address
Адрес, по которому требуется ждать. Если значение в поле Address отличается от значения в CompareAddress, функция возвращается немедленно. Если значения совпадают, функция не возвращается до тех пор, пока другой поток в том же процессе не сигнализирует об изменении значения в поле Address путем вызова WakeByAddressSingle или WakeByAddressAll или истечения времени ожидания, в зависимости от того, что наступит первым.
[in] CompareAddress
Указатель на расположение ранее наблюдаемого значения в поле Адрес. Функция возвращает, если значение адреса отличается от значения в CompareAddress.
[in] AddressSize
Размер значения в байтах. Этот параметр может иметь значение 1
, 2
, 4
или 8
.
[in, optional] dwMilliseconds
Время ожидания в миллисекундах до истечения времени ожидания операции. Если этот параметр имеет значение INFINITE, поток ожидает неограниченное время.
Возвращаемое значение
TRUE
Значение , если ожидание выполнено успешно. Если операция завершается сбоем, функция возвращает .FALSE
Если ожидание завершается сбоем, вызовите Метод GetLastError , чтобы получить расширенные сведения об ошибке. В частности, если время ожидания операции истекает, GetLastError возвращает ERROR_TIMEOUT.
Комментарии
Разработчикам приложений Microsoft Store может потребоваться получить, synchronization.lib
установив пакет средств разработки программного обеспечения для Windows (SDK).
Функция WaitOnAddress может использоваться потоком для ожидания изменения определенного значения с некоторого нежелательного значения на любое другое. WaitOnAddress эффективнее, чем использование функции Спящего режима в while
цикле, так как WaitOnAddress не влияет на планировщик потоков. WaitOnAddress также проще использовать, чем объект события, так как нет необходимости создавать и инициализировать событие, а затем убедиться, что оно правильно синхронизировано со значением. На WaitOnAddress не влияют условия нехватки памяти, кроме потенциального пробуждения потока, как указано ниже.
Любой поток в рамках одного процесса, изменяющий значение по адресу, по которому ожидаются потоки, должен вызывать WakeByAddressSingle , чтобы разбудить один ожидающий поток, или WakeByAddressAll для пробуждения всех ожидающих потоков. Если вызывается WakeByAddressSingle , другие ожидающие потоки продолжают ждать.
- Условия нехватки памяти
- Предыдущее пробуждение по тому же адресу было прервано
- Выполнение кода в проверенной сборке операционной системы
Примеры
В следующем примере показано, как использовать 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 |
Header | synchapi.h (включая Windows.h) |
Библиотека | Synchronization.lib |
DLL | API-MS-Win-Core-Synch-l1-2-0.dll |