WaitOnAddress 函式 (synchapi.h)

等候位於指定位址的值變更。

語法

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

參數

[in] Address

要等候的位址。 如果 Address 上的值與 CompareAddress 的值不同,函式會立即傳回。 如果值相同,則函式不會傳回,直到相同進程中的另一個線程發出呼叫 WakeByAddressSingleWakeByAddressAll 或逾時之前,位址上的值已變更的訊號,否則會先傳回。

[in] CompareAddress

位於 Address 之先前觀察到值位置的指標。 當 Address 的值與 CompareAddress 的值不同時,函式會傳回 。

[in] AddressSize

值的大小,以位元組為單位。 這個參數可以是 1248

[in, optional] dwMilliseconds

作業逾時之前要等候的毫秒數。如果此參數為 INFINITE,線程會無限期等候。

傳回值

TRUE 如果等候成功,則為 。 如果工作失敗,函式會傳 FALSE回 。 如果等候失敗,請呼叫 GetLastError 以取得擴充的錯誤資訊。 特別是,如果作業逾時, GetLastError傳回ERROR_TIMEOUT

備註

安裝 Windows 軟體開發套件 (SDK) 可能需要取得 synchronization.lib Microsoft Store 應用程式開發人員。

WaitOnAddress 函式可供線程使用,以等候特定值從某些非想要的值變更為任何其他值。 WaitOnAddress 比在迴圈中使用 whileSleep 函式更有效率,因為 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 記憶體保護區中可用的 Vertdll API