Aracılığıyla paylaş


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ı, bir kaynak havuzuna erişimi kontrol etmek için kullanılabilen sayaç semaforlarıdı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ı, bir WaitOne nesnesi durumunda WaitHandle sınıfından devralınan System.Threading.Semaphore yöntemini çağırarak veya bir SemaphoreSlim.Wait nesnesi durumunda SemaphoreSlim.WaitAsync ya da SemaphoreSlim yöntemini çağırarak semafora girer. Çağrı geri döndüğünde, semafordaki sayı azalır. Bir iş parçacığı giriş istediğinde ve sayı sıfır olduğunda, iş parçacığı engellenir. İş parçacıkları Semaphore.Release veya SemaphoreSlim.Release yöntemini çağırarak semaforu serbest bıraktığında, 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ığı, semafora birden fazla kez girmek için System.Threading.Semaphore nesnesinin yöntemini veya WaitOne nesnesinin SemaphoreSlimWait yöntemini tekrar tekrar çağırabilir. Semaforu serbest bırakmak için, iş parçacığı Semaphore.Release() veya SemaphoreSlim.Release() yöntemi aşırı yüklemesini aynı sayıda çağırabilir ya da Semaphore.Release(Int32) veya SemaphoreSlim.Release(Int32) yöntemi aşırı yüklemesini çağırarak serbest bırakılacak giriş sayısını belirtebilir.

Semaforlar ve İplik Kimliği

İki semafor türü, WaitOne, Wait, Release ve SemaphoreSlim.Release yöntemlerine yapılan çağrılarda iş parçacığı kimliğini zorlamaz. Örneğin, semaforlar için yaygın bir kullanım senaryosu, bir üretici iş parçacığı ile bir tüketici iş parçacığını içerir, bu iş parçacıklarından biri her zaman semafor sayısını artırırken diğeri her zaman azaltır.

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. Semafordaki sayı dolu ve A iş parçacığı sonunda Release'ı çağırdığında bir SemaphoreFullException fırlatılır.

Adlandırılmış Semaforlar

Windows işletim sistemi semaforların adlara sahip olmasını sağlar. Adlandırılmış semafor sistem genelinde geçerlidir. 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 .

Uyarı

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.

Adlandırılmış bir semaforu temsil eden Semaphore nesnesini korumak için, bir System.Security.AccessControl.SemaphoreSecurity nesneyi belirten bir oluşturucu kullanarak erişim kontrol güvenliğini 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 bakınız