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.
İ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.
Bu içeriğin kaynağı GitHub'da bulunabilir; burada ayrıca sorunları ve çekme isteklerini oluşturup gözden geçirebilirsiniz. Daha fazla bilgi için katkıda bulunan kılavuzumuzu inceleyin.
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Paylaşılan kaynağa erişimi eşitlemek veya iş parçacığı etkileşimini denetlemek için kullanılan .NET iş parçacığı eşitleme temel bilgileri hakkında bilgi edinin