條件變數

條件變數是同步處理基本類型,可讓執行緒等到發生特定條件為止。 條件變數是無法跨進程共用的使用者模式物件。

條件變數可讓執行緒以不可部分完成的方式釋放鎖定,並進入睡眠狀態。 它們可以搭配重要區段或讀取器/寫入器 (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 迴圈中) 。

您可以使用 WakeConditionVariableWakeAllConditionVariable 來喚醒其他執行緒,不論是在與條件變數相關聯的鎖定內部或外部。 通常最好在喚醒其他執行緒之前釋放鎖定,以減少內容切換的數目。

搭配相同鎖定使用多個條件變數通常很方便。 例如,讀取器/寫入器鎖定的實作可能會使用單一關鍵區段,但針對讀取器和寫入器使用不同的條件變數。

使用條件變數