Aracılığıyla paylaş


Koşul Değişkenleri

Koşul değişkenleri, iş parçacıklarının belirli bir koşul gerçekleşene kadar beklemesini sağlayan eşitleme ilkelleridir. Koşul değişkenleri, işlemler arasında paylaşılamayan kullanıcı modu nesneleridir.

Koşul değişkenleri, iş parçacıklarının atomik olarak bir kilidi serbest bırakmasını ve uyku durumuna girmesini sağlar. Kritik bölümler veya ince okuyucu/yazıcı (SRW) kilitleriyle kullanılabilirler. Koşul değişkenleri, bekleyen iş parçacıklarını "uyandırma" veya "tümünü uyandırma" işlemlerini destekler. Bir iş parçacığı uyandırıldıktan sonra, iş parçacığı uyku durumuna girdiğinde serbest bıraktığı kilidi yeniden alır.

Çağıranın bir CONDITION_VARIABLE yapısı ayırması ve InitializeConditionVariable çağırarak (yapıyı dinamik olarak başlatmak için) veya sabit CONDITION_VARIABLE_INIT yapı değişkenine ataması gerektiğini unutmayın (yapıyı statik olarak başlatmak için).

Windows Server 2003 ve Windows XP: Koşulu değişkenleri desteklenmez.

Koşul değişkeni işlevleri aşağıdadır.

Koşul değişkeni işlevi Açıklama
InitializeConditionVariable Bir koşul değişkeni başlatır.
SleepConditionVariableCS Belirtilen koşul değişkeninde uyku moduna alır ve belirtilen kritik bölümü atomik işlem olarak serbest bırakır.
SleepConditionVariableSRW Belirtilen koşul değişkeninde uyku moduna alır ve belirtilen SRW kilidini atomik işlem olarak serbest bırakır.
WakeAllConditionVariable Belirtilen koşul değişkenini bekleyen tüm iş parçacıklarını uyandırır.
WakeConditionVariable Belirtilen koşul değişkenini beklerken tek bir iş parçacığını uyandırır.

 

Aşağıdaki sahte kod, koşul değişkenlerinin tipik kullanım desenini gösterir.

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
}

Örneğin, bir okuyucu/yazıcı kilidi uygulamasında, TestPredicate işlevi geçerli kilit isteğinin mevcut sahiplerle uyumlu olduğunu doğrular. Bu durumda kilidi alın; aksi takdirde, uyuyun. Daha ayrıntılı bir örnek için bkz. Koşul Değişkenlerini Kullanma.

Koşul değişkenleri, sahte uyandırmalara (açık uyandırma ile ilişkili olmayanlar) ve çalınan uyandırmalara (başka bir iş parçacığı uyanan iş parçacığından önce çalıştırmayı yönetir) tabidir. Bu nedenle, bir uyku işlemi döndürdüğünde bir koşulu (genellikle döngüde) yeniden denetlemeniz gerekir.

WakeConditionVariable kullanarak veya WakeAllConditionVariable kullanarak diğer iş parçacıklarını, koşul değişkeniyle ilişkili kilidin içinde veya dışında uyandırabilirsiniz. Bağlam anahtarı sayısını azaltmak için diğer iş parçacıklarını uyandırmadan önce kilidi serbest bırakmak genellikle daha iyidir.

Aynı kilitle birden fazla koşul değişkeni kullanmak genellikle kullanışlıdır. Örneğin, okuyucu/yazıcı kilidinin uygulanması tek bir kritik bölüm kullanabilir, ancak okuyucular ve yazarlar için ayrı koşul değişkenleri kullanabilir.

Koşul Değişkenlerini Kullanarak