共用方式為


條件變數

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

條件變數可讓線程以不可部分完成的方式釋放鎖定並進入睡眠狀態。 它們可以搭配重要區段或瘦弱的讀取器/寫入器(SRW)鎖定使用。 條件變數支援「喚醒一個」或「全部喚醒」等候線程的作業。 在線程喚醒之後,它會在線程進入睡眠狀態時重新取得釋放的鎖定。

請注意,呼叫端必須配置 CONDITION_VARIABLE 結構,並藉由呼叫 InitializeConditionVariable 來初始化它(以動態方式初始化結構),或將常數 CONDITION_VARIABLE_INIT 指派給結構變數(以靜態方式初始化結構)。

Windows Server 2003 和 Windows XP:不支援 條件變數。

以下是條件變數函式。

條件變數函式 描述
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 函式會確認目前的鎖定要求與現有擁有者相容。 如果是,請取得鎖定;否則,請睡眠。 如需更詳細的範例,請參閱使用條件變數

條件變數受限於假覺醒(與明確喚醒無關的喚醒)和遭竊的喚醒(另一個線程設法在喚醒線程之前執行)。 因此,您應該在睡眠作業傳回之後,重新檢查述詞(通常是在 迴圈中)。

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

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

使用條件變數