Funzione WaitOnAddress (synchapi.h)
Attende che il valore all'indirizzo specificato venga modificato.
Sintassi
BOOL WaitOnAddress(
[in] volatile VOID *Address,
[in] PVOID CompareAddress,
[in] SIZE_T AddressSize,
[in, optional] DWORD dwMilliseconds
);
Parametri
[in] Address
Indirizzo in cui attendere. Se il valore in Address è diverso dal valore in CompareAddress, la funzione restituisce immediatamente. Se i valori sono uguali, la funzione non restituisce fino a quando non viene restituito un altro thread nello stesso processo indica che il valore in Address è cambiato chiamando WakeByAddressSingle o WakeByAddressAll o il timeout trascorso.
[in] CompareAddress
Puntatore alla posizione del valore osservato in precedenza in Indirizzo. La funzione restituisce quando il valore in Address differisce dal valore in CompareAddress.
[in] AddressSize
Dimensioni del valore, in byte. Questo parametro può essere 1
, , 4
2
o 8
.
[in, optional] dwMilliseconds
Numero di millisecondi da attendere prima del timeout dell'operazione. Se questo parametro è INFINITE, il thread attende in modo indefinito.
Valore restituito
TRUE
se l'attesa ha avuto esito positivo. Se l'operazione ha esito negativo, la funzione restituisce FALSE
. Se l'attesa ha esito negativo, chiamare GetLastError per ottenere informazioni di errore estese. In particolare, se l'operazione scade, GetLastError restituisce ERROR_TIMEOUT.
Commenti
Gli sviluppatori di app di Microsoft Store potrebbero dover ottenere synchronization.lib
installando il Windows Software Development Kit (Windows SDK) (SDK).
La funzione WaitOnAddress può essere usata da un thread per attendere che un determinato valore venga modificato da un valore non indesiderato a qualsiasi altro valore. WaitOnAddress è più efficiente rispetto all'uso della funzione Sleep all'interno di un while
ciclo perché WaitOnAddress non interferisce con l'utilità di pianificazione del thread. WaitOnAddress è anche più semplice da usare rispetto a un oggetto evento perché non è necessario creare e inizializzare un evento e quindi assicurarsi che sia sincronizzato correttamente con il valore. WaitOnAddress non è interessato da condizioni di memoria ridotta, oltre a svegliare il thread prima di quanto indicato di seguito.
Qualsiasi thread all'interno dello stesso processo che modifica il valore all'indirizzo in cui i thread sono in attesa deve chiamare WakeByAddressSingle per riattivare un singolo thread in attesa o WakeByAddressAll per riattivare tutti i thread in attesa. Se WakeByAddressSingle viene chiamato, altri thread in attesa continuano ad attendere.
- Condizioni di memoria ridotta
- Una riattivazione precedente dello stesso indirizzo è stata abbandonata
- Esecuzione del codice in una compilazione controllata del sistema operativo
Esempio
Nell'esempio seguente viene illustrato come usare 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;
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 8 [app desktop | App UWP] |
Server minimo supportato | Windows Server 2012 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | synchapi.h (includere Windows.h) |
Libreria | Sync.lib |
DLL | API-MS-Win-Core-Synch-l1-2-0.dll |