條件變數
條件變數是同步處理基本類型,可讓執行緒等到發生特定條件為止。 條件變數是無法跨進程共用的使用者模式物件。
條件變數可讓執行緒以不可部分完成的方式釋放鎖定,並進入睡眠狀態。 它們可以搭配重要區段或讀取器/寫入器 (SRW) 鎖定使用。 條件變數支援「喚醒一」或「全部喚醒」等候執行緒的作業。 線上程喚醒之後,它會線上程進入睡眠狀態時重新取得釋放的鎖定。
請注意,呼叫端必須配置 CONDITION_VARIABLE 結構,並藉由呼叫 InitializeConditionVariable (來) 動態初始化結構,或將常數 CONDITION_VARIABLE_INIT 指派給結構變數, (以靜態方式初始化結構) 。
Windows Server 2003 和 Windows XP: 不支援條件變數。
以下是條件變數函式。
條件變數函式 | Description |
---|---|
InitializeConditionVariable | 初始化條件變數。 |
SleepConditionVariableCS | 在指定的條件變數上睡眠,並將指定的關鍵區段釋放為不可部分完成的作業。 |
SleepConditionVariableSRW | 在指定的條件變數上睡眠,並將指定的 SRW 鎖定釋放為不可部分完成的作業。 |
WakeAllConditionVariable | 喚醒所有等候指定條件變數的執行緒。 |
WakeConditionVariable | 喚醒在指定的條件變數上等候的單一線程。 |
下列虛擬程式碼示範條件變數的一般使用模式。
CRITICAL_SECTION CritSection;
CONDITION_VARIABLE ConditionVar;
void PerformOperationOnSharedData()
{
EnterCriticalSection(&CritSection);
// Wait until the predicate is TRUE
while( TestPredicate() == FALSE )
{
SleepConditionVariableCS(&ConditionVar, &CritSection, INFINITE);
}
// The data can be changed safely because we own the critical
// section and the predicate is TRUE
ChangeSharedData();
LeaveCriticalSection(&CritSection);
// If necessary, signal the condition variable by calling
// WakeConditionVariable or WakeAllConditionVariable so other
// threads can wake
}
例如,在讀取器/寫入器鎖定的實作中,函 TestPredicate
式會確認目前的鎖定要求與現有的擁有者相容。 如果是,請取得鎖定;否則為睡眠。 如需更詳細的範例,請參閱 使用條件變數。
條件變數受限於假性喚醒, (未與明確喚醒) 相關聯的喚醒和遭竊喚醒, (另一個執行緒管理在喚醒執行緒) 之前執行。 因此,您應該在睡眠作業傳回之後,重新檢查述詞 (通常是在 while 迴圈中) 。
您可以使用 WakeConditionVariable 或 WakeAllConditionVariable 來喚醒其他執行緒,不論是在與條件變數相關聯的鎖定內部或外部。 通常最好在喚醒其他執行緒之前釋放鎖定,以減少內容切換的數目。
搭配相同鎖定使用多個條件變數通常很方便。 例如,讀取器/寫入器鎖定的實作可能會使用單一關鍵區段,但針對讀取器和寫入器使用不同的條件變數。
相關主題