Semafor ve SemaphoreSlim

System.Threading.Semaphore sınıfı adlandırılmış (systemwide) veya yerel semaforu temsil eder. Win32 semafor nesnesinin etrafındaki ince bir sarmalayıcıdır. Win32 semaforları, kaynak havuzuna erişimi denetlemek için kullanılabilen semaforları saymaktadır.

SemaphoreSlim sınıfı, bekleme sürelerinin çok kısa olması beklenen tek bir işlem içinde beklemek için kullanılabilecek hafif, hızlı bir semaforu temsil eder. SemaphoreSlim , ortak dil çalışma zamanı (CLR) tarafından sağlanan eşitleme temel öğelerine mümkün olduğunca çok bağlıdır. Ancak, birden çok semaforda beklemeyi desteklemek için gerekli olan, gevşek olarak başlatılan, çekirdek tabanlı bekleme tanıtıcıları da sağlar. SemaphoreSlim ayrıca iptal belirteçlerinin kullanımını da destekler, ancak adlandırılmış semaforları veya eşitleme için bekleme tutamacının kullanımını desteklemez.

Sınırlı Kaynağı Yönetme

İş parçacıkları semaforu, bir System.Threading.Semaphore nesne veya nesne durumunda SemaphoreSlim veya SemaphoreSlim.WaitAsyncSemaphoreSlim.Wait yönteminde sınıfından WaitHandle devralınan yöntemini çağırarak WaitOne girer. Çağrı döndürdüğünde semafordaki sayı azalmış. bir iş parçacığı giriş istediğinde ve sayı sıfır olduğunda, iş parçacığı engeller. İş parçacıkları veya SemaphoreSlim.Release yöntemini çağırarak semaforu serbest bıraktığındaSemaphore.Release, engellenen iş parçacıklarının girmesine izin verilir. Engellenen iş parçacıklarının semafora girmesi için ilk giren, ilk çıkan (FIFO) veya son giren ilk çıkar (LIFO) gibi garantili bir düzen yoktur.

İş parçacığı, semaforu birden çok kez girmek için nesnenin System.Threading.Semaphore yöntemini veya nesnesinin WaitOneSemaphoreSlimWait yöntemini tekrar tekrar çağırabilir. Semaforu serbest bırakmak için, iş parçacığı veya SemaphoreSlim.Release() yöntemi aşırı yüklemesini Semaphore.Release() aynı sayıda çağırabilir veya veya SemaphoreSlim.Release(Int32) yöntemi aşırı yüklemesini Semaphore.Release(Int32) çağırabilir ve serbest bırakılacak girdi sayısını belirtebilir.

Semaforlar ve İş Parçacığı Kimliği

İki semafor türü, , , WaitReleaseve SemaphoreSlim.Release yöntemlerine WaitOneyapılan çağrılarda iş parçacığı kimliğini zorlamaz. Örneğin, semaforlar için yaygın bir kullanım senaryosu, bir iş parçacığının her zaman semafor sayısını artırması ve diğerinin bunu her zaman azaltması ile bir üretici iş parçacığını ve tüketici iş parçacığını içerir.

Bir iş parçacığının semaforu çok fazla serbest bırakmamasını sağlamak programcının sorumluluğundadır. Örneğin, bir semaforun en fazla iki sayısı olduğunu ve A ve B iş parçacığının semafora girdiğini varsayalım. B iş parçacığındaki bir programlama hatası iki kez çağırmasına Release neden olursa, her iki çağrı da başarılı olur. Semafor üzerindeki sayı dolu olur ve A iş parçacığı sonunda çağırdığında Releasea SemaphoreFullException oluşturulur.

Adlandırılmış Semaforlar

Windows işletim sistemi semaforların adlara sahip olmasını sağlar. Adlandırılmış semafor sistem genelindedir. Diğer bir ifadeyle, adlandırılmış semafor oluşturulduktan sonra tüm işlemlerdeki tüm iş parçacıkları tarafından görülebilir. Bu nedenle, adlandırılmış semafor hem işlemlerin hem de iş parçacıklarının etkinliklerini eşitlemek için kullanılabilir.

Bir adı belirten oluşturuculardan birini kullanarak adlandırılmış sistem semaforunu temsil eden bir nesne oluşturabilirsiniz Semaphore .

Not

Adlandırılmış semaforlar sistem genelinde olduğundan, aynı adlandırılmış semaforu temsil eden birden çok Semaphore nesneye sahip olmak mümkündür. Bir oluşturucuyu veya Semaphore.OpenExisting yöntemini her çağırdığınızda yeni Semaphore bir nesne oluşturulur. Aynı adın belirtilmesi, aynı adlandırılmış semaforu temsil eden birden çok nesne oluşturur.

Adlandırılmış semaforları kullanırken dikkatli olun. Sistem genelinde olduklarından, aynı adı kullanan başka bir işlem beklenmedik bir şekilde semaforunuzu girebilir. Aynı bilgisayarda yürütülen kötü amaçlı kod, bunu hizmet reddi saldırısının temeli olarak kullanabilir.

Erişim denetimi güvenliğini, tercihen bir nesneyi belirten bir Semaphore oluşturucu kullanarak adlandırılmış semaforu temsil eden bir System.Security.AccessControl.SemaphoreSecurity nesneyi korumak için kullanın. Yöntemini kullanarak Semaphore.SetAccessControl erişim denetimi güvenliği de uygulayabilirsiniz, ancak bu, semaforun oluşturulduğu zaman ile korunduğu zaman arasında bir güvenlik açığı penceresi bırakır. Semaforların erişim denetimi güvenliğiyle korunması kötü amaçlı saldırıların önlenmesine yardımcı olur, ancak istenmeyen ad çakışmaları sorununu çözmez.

Ayrıca bkz.