Aracılığıyla paylaş


Birden Çok İş Parçacığının Yürütülmesini Senkronize Etme

Yarış koşullarını ve kilitlenmeleri önlemek için, paylaşılan kaynaklara birden çok iş parçacığı tarafından erişimin eşitlenmesi gerekir. Eşitleme, birbirine bağlı kodun doğru sırada yürütülmesini sağlamak için de gereklidir.

Birden çok iş parçacığını eşitlemek için tutamaçları kullanılabilecek bir dizi nesne vardır. Bu nesneler şunlardır:

  • Konsol giriş arabellekleri
  • Etkinlikler
  • Mutexes
  • Süreç
  • Semafor
  • Konu Başlıkları
  • Zamanlayıcılar

Bu nesnelerin her birinin durumu sinyalli veya sinyalsiz. bekleme işlevlerinden birine yapılan çağrıda bu nesnelerden herhangi birine tanıtıcı belirttiğinizde, belirtilen nesnenin durumu işaretlenene kadar çağıran iş parçacığının yürütülmesi engellenir.

Bu nesnelerden bazıları, bir olay gerçekleşene kadar bir iş parçacığını engellemede yararlıdır. Örneğin, bir tuş vuruşu veya fare düğmesi tıklaması gibi okunmamış giriş olduğunda konsol giriş arabellek tutamacı işaret edilir. Bir işlem veya iş parçacığı sonlandırıldığında, işlem ve iş parçacığı tanıtıcılarına sinyal gönderilir. Bu, örneğin bir işlemin bir alt işlem oluşturmasına ve ardından yeni işlem sonlandırılana kadar kendi yürütmesini engellemesine olanak tanır.

Diğer nesneler, paylaşılan kaynakları aynı anda erişime karşı koruma konusunda yararlıdır. Örneğin, birden çok iş parçacığının her birinin bir mutex nesnesi tanıtıcısı olabilir. Paylaşılan kaynağa erişmeden önce, iş parçacıklarının mutex durumunun işaretlenmesini beklemesi için bekleme işlevlerinden birini çağırması gerekir. Mutex işaretlendiğinde kaynağa erişmek için yalnızca bir bekleyen iş parçacığı serbest bırakılır. Mutex'in durumu, diğer bekleyen iş parçacıklarının engellenmiş kalması için hemen sinyalsiz hale getirilir. İş parçacığı kaynakla işini bitirdiğinde, diğer iş parçacıklarının kaynağa erişmesine izin vermek için mutex'in durumunu "sinyalli" olarak ayarlaması gerekir.

Tek bir işlemin iş parçacıkları için kritik bölüm nesneleri, mutex'lerden daha verimli bir eşitleme aracı sağlar. Kritik bir bölüm, aynı anda yalnızca bir iş parçacığının korumalı kaynağı kullanmasına izin vermek üzere bir mutex gibi kullanılır. İş parçacığı, kritik bir bölümün sahipliğini istemek için EnterCriticalSection işlevini kullanabilir. Başka bir iş parçacığına zaten aitse, istekte bulunan iş parçacığı engellenir. İş parçacığı, kritik bölümün alınamaması durumunda engelleme olmadan kritik bir bölümün sahipliğini istemek için tryEnterCriticalSectionişlevinikullanabilir. Sahipliği aldıktan sonra, iş parçacığı korunan kaynağı serbestçe kullanabilir. İşlemin diğer iş parçacıklarının yürütülmesi, aynı kritik bölüme girmeye çalışmadıkları sürece etkilenmez.

WaitForInputIdle işlevi, belirtilen işlem başlatılıp kullanıcının girişini beklemeye hazır hale gelene ve bekleyen hiçbir giriş kalmayana kadar bir iş parçacığının beklemesini sağlar. WaitForInputIdle çağırmak üst ve alt işlemleri eşitlemek için yararlı olabilir çünkü CreateProcessalt işlemin başlatılmasını beklemeden döner.

Daha fazla bilgi için bkz. Senkronizasyon.