Aracılığıyla paylaş


Kritik Bölüm Nesneleri

kritik bölüm nesnesi, bir mutex nesnesi tarafından sağlanana benzer bir eşitleme sağlar, ancak kritik bir bölüm yalnızca tek bir işlemin iş parçacıkları tarafından kullanılabilir. Kritik bölüm nesneleri işlemler arasında paylaşılamaz.

Olay, mutex ve semafor nesneleri tek işlemli bir uygulamada da kullanılabilir, ancak kritik bölüm nesneleri karşılıklı dışlama eşitlemesi (işlemciye özgü bir test ve ayarlama yönergesi) için biraz daha hızlı ve daha verimli bir mekanizma sağlar. Bir mutex nesnesi gibi kritik bölüm nesnesi de aynı anda yalnızca bir iş parçacığına sahip olabilir ve bu da paylaşılan bir kaynağı aynı anda erişimden korumak için yararlı olur. Bir mutex nesnesinin aksine, kritik bir bölümün terk edilip edilmediğini anlamanın hiçbir yolu yoktur.

Windows Server 2003 Service Pack 1 (SP1) ile başlayarak, kritik bir bölümde bekleyen iş parçacıkları kritik bölümü ilk gelen ilk hizmet temelinde almaz. Bu değişiklik çoğu kod için performansı önemli ölçüde artırır. Ancak, bazı uygulamalar ilk gelen, ilk çıkan (FIFO) sıralamaya bağlıdır ve Geçerli Windows sürümlerinde (örneğin, hız sınırlayıcısı olarak kritik bölümleri kullanan uygulamalar) kötü veya hiç performans göstermeyebilir. Kodunuzun düzgün çalışmaya devam ettiğinden emin olmak için ek bir eşitleme düzeyi eklemeniz gerekebilir. Örneğin, çalışmalarını eşitlemek için kritik bir bölüm nesnesi kullanan bir üretici iş parçacığınız ve bir tüketici iş parçacığınız olduğunu varsayalım. Her iş parçacığı için bir tane olmak üzere diğer iş parçacığının devam etmeye hazır olduğunu belirten iki olay nesnesi oluşturun. Tüketici iş parçacığı, kritik bölüme girmeden önce üreticinin olayının sinyalini vermesini bekler ve üretici iş parçacığı, kritik bölüme girmeden önce tüketici iş parçacığının olayına işaret etmelerini bekler. Her iş parçacığı kritik bölümden ayrıldıktan sonra, diğer iş parçacığını serbest bırakmak için olayına işaret eder.

Windows Server 2003 ve Windows XP: Kritik bir bölümde bekleyen İş Parçacıkları bekleme kuyruğuna eklenir; bunlar uyandırılır ve genellikle kritik bölümü kuyruğa eklendikleri sırayla alır. Ancak, iş parçacıkları bu kuyruğa yeterince hızlı bir şekilde eklenirse, bekleyen her iş parçacığını uyandırmak için gereken süre nedeniyle performans düşebilir.

İşlem, kritik bir bölüm tarafından kullanılan belleği ayırmakla sorumludur. Genellikle, bu yalnızca CRITICAL_SECTIONtüründe bir değişken bildirilerek yapılır. İşlemin iş parçacıkları tarafından kullanılabilmesi için önce InitializeCriticalSectionveya InitializeCriticalSectionAndSpinCountişlevinikullanarak kritik bölümü başlatın.

İş parçacığı, kritik bir bölümün sahipliğini istemek için EnterCriticalSection veya TryEnterCriticalSection işlevini kullanır. Kritik bir bölümün sahipliğini serbest bırakmak için LeaveCriticalSection işlevini kullanır. Kritik bölüm nesnesi şu anda başka bir iş parçacığına aitse, EnterCriticalSection sahiplik için süresiz olarak bekler. Buna karşılık, karşılıklı dışlama için bir mutex nesnesi kullanıldığında, bekleme işlevleri belirtilen zaman aşımı aralığını kabul. TryEnterCriticalSection işlevi, çağıran iş parçacığını engellemeden kritik bir bölüm girmeye çalışır.

bir iş parçacığı kritik bir bölüme sahip olduğunda, yürütmesini engellemeden EnterCriticalSection veya tryEnterCriticalSectionek çağrılar yapabilir. Bu, bir iş parçacığının zaten sahip olduğu kritik bir bölümü beklerken kilitlenmesini önler. Sahipliğini serbest bırakmak için, iş parçacığının kritik bölüme her girişinde LeaveCriticalSection bir kez çağırması gerekir. Bekleyen iş parçacıklarının kritik bölümün sahipliğini alma sırası konusunda bir garanti yoktur.

İş parçacığı, kritik bölüm nesnesi için bir döndürme sayısı belirtmek üzere InitializeCriticalSectionAndSpinCount veya SetCriticalSectionSpinCount işlevini kullanır. Döndürme, bir iş parçacığı kilitlenmiş kritik bir bölüm almaya çalıştığında, iş parçacığı bir döngüye girer, kilidin serbest bırakılıp bırakılmadığını denetler ve kilit serbest bırakılmazsa iş parçacığı uyku moduna geçer. Tek işlemcili sistemlerde, döndürme sayısı yoksayılır ve kritik bölüm döndürme sayısı 0 (sıfır) olarak ayarlanır. Çok işlemcili sistemlerde kritik bölüm kullanılamıyorsa, kritik bölümle ilişkili bir semafor üzerinde bekleme işlemi gerçekleştirmeden önce çağıran iş parçacığı dwSpinCount kez döner. Döndürme işlemi sırasında kritik bölüm serbest kalırsa, çağıran iş parçacığı bekleme işleminden kaçınıyor.

İşlemin herhangi bir iş parçacığı, kritik bölüm nesnesi başlatıldığında ayrılan sistem kaynaklarını serbest bırakmak için DeleteCriticalSection işlevini kullanabilir. Bu işlev çağrıldıktan sonra kritik bölüm nesnesi eşitleme için kullanılamaz.

Kritik bir bölüm nesnesine sahip olduğunda, etkilenen diğer iş parçacıkları yalnızca EnterCriticalSectionçağrısında sahipliğini bekleyen iş parçacıklarıdır. Beklemeyen iş parçacıklarının çalışmaya devam etmesi ücretsizdir.

Mutex Nesneleri

Kritik Bölüm Nesneleri Kullanarak