Eşitleme temellerine genel bakış

.NET, paylaşılan bir kaynağa erişimi eşitlemek veya iş parçacığı etkileşimini koordine etmek için kullanabileceğiniz bir dizi tür sağlar.

Önemli

Paylaşılan bir kaynağın erişimini korumak için aynı eşitleme temel örneğini kullanın. Aynı kaynağı korumak için farklı eşitleme temel örnekleri kullanırsanız, eşitleme temel öğesinin sağladığı korumayı atlatırsınız.

WaitHandle sınıfı ve basit eşitleme türleri

Birden çok .NET eşitleme temel öğesi, yerel bir işletim sistemi eşitleme tutamacını System.Threading.WaitHandle kapsülleyen ve iş parçacığı etkileşimi için bir sinyal mekanizması kullanan sınıfından türetilir. Bu sınıflar şunlardır:

  • System.Threading.Mutex, paylaşılan bir kaynağa özel erişim verir. Bir iş parçacığına sahip değilse bir mutex'in durumu işaret edilir.
  • System.Threading.Semaphore, paylaşılan kaynağa veya bir kaynak havuzuna eşzamanlı olarak erişebilecek iş parçacığı sayısını sınırlar. Bir semaforun durumu, sayısı sıfırdan büyük olduğunda işaretlenmeyen ve sayısı sıfır olduğunda işaretsiz olarak ayarlanır.
  • System.Threading.EventWaitHandle, bir iş parçacığı eşitleme olayını temsil eder ve sinyalli veya imzasız durumda olabilir.
  • System.Threading.AutoResetEvent, ve'den EventWaitHandle türetilir, sinyal gönderildiğinde, tek bir bekleyen iş parçacığı serbest bırakıldıktan sonra otomatik olarak imzasız duruma sıfırlanır.
  • System.Threading.ManualResetEvent, ve'den EventWaitHandle türetilir, sinyal gönderildiğinde, yöntem çağrılana Reset kadar sinyalli durumda kalır.

.NET Framework'te, WaitHandle türünden System.MarshalByRefObjecttüretildiği için, bu türler iş parçacıklarının uygulama etki alanı sınırları arasındaki etkinliklerini eşitlemek için kullanılabilir.

.NET Framework, .NET Core ve .NET 5+ işletim sistemlerinde bu türlerden bazıları, işletim sistemi genelinde görünen ve işlemler arası eşitleme için kullanılabilen adlandırılmış sistem eşitleme tanıtıcılarını temsil edebilir:

Daha fazla bilgi için bkz WaitHandle . API başvurusu.

Basit eşitleme türleri, temel alınan işletim sistemi tanıtıcılarına güvenmez ve genellikle daha iyi performans sağlar. Ancak, bunlar işlemler arası eşitleme için kullanılamaz. Bir uygulama içinde iş parçacığı eşitlemesi için bu türleri kullanın.

Bu türlerden bazıları, türünden WaitHandletüretilen türlerin alternatifleridir. Örneğin, SemaphoreSlim için basit bir alternatiftir Semaphore.

Paylaşılan kaynağa erişimi eşitleme

.NET, paylaşılan kaynağa erişimi birden çok iş parçacığı tarafından denetlemek için bir dizi eşitleme temel bilgisi sağlar.

İzleme sınıfı

sınıfı, System.Threading.Monitor kaynağı tanımlayan nesne üzerinde bir kilit alarak veya serbest bırakarak paylaşılan kaynağa birbirini dışlayan erişim verir. Bir kilit tutulurken, kilidi tutan iş parçacığı kilidi tekrar alabilir ve serbest bırakılabilir. Diğer iş parçacıklarının kilidi almaları engellenir ve Monitor.Enter yöntemi kilit serbest bırakılana kadar bekler. Enter yöntemi serbest bırakılmış bir kilit alır. Ayrıca, bir iş parçacığının Monitor.TryEnter kilit almaya çalıştığı süreyi belirtmek için yöntemini de kullanabilirsiniz. Sınıfın Monitor iş parçacığı benzitesi olduğundan, kilit alan iş parçacığının yöntemini çağırarak kilidi serbest bırakması Monitor.Exit gerekir.

, Monitor.Pulseve Monitor.PulseAll yöntemlerini kullanarak aynı nesne üzerinde kilit alan iş parçacıklarının etkileşimini Monitor.Waitkoordine edebilirsiniz.

Daha fazla bilgi için bkz Monitor . API başvurusu.

Not

Sınıfı doğrudan kullanmak yerine paylaşılan bir kaynağa erişimi eşitlemek için C# dilinde lock deyimini ve Visual Basic'teki SyncLock deyimini Monitor kullanın. Bu deyimler, alınan kilidin Enter her zaman serbest bırakıldığından emin olmak için ve Exit yöntemleri ve bir try…finally blok kullanılarak uygulanır.

Mutex sınıfı

System.Threading.Mutex gibi Monitorsınıfı paylaşılan bir kaynağa özel erişim verir. Bir mutex'in sahipliğini istemek için Mutex.WaitOne yöntemi aşırı yüklemelerinden birini kullanın. gibi Monitor, Mutex iş parçacığı benzitesine sahiptir ve bir mutex alan iş parçacığının yöntemini çağırarak serbest bırakması Mutex.ReleaseMutex gerekir.

'nin Mutex aksineMonitor, sınıfı işlemler arası eşitleme için kullanılabilir. Bunu yapmak için, işletim sistemi genelinde görünen adlandırılmış bir mutex kullanın. Adlandırılmış bir mutex örneği oluşturmak için, bir ad belirten bir Mutex oluşturucu kullanın. Mevcut adlandırılmış sistem mutex'ini Mutex.OpenExisting açmak için yöntemini de çağırabilirsiniz.

Daha fazla bilgi için Mutexes makalesine ve API başvurusuna Mutex bakın.

SpinLock yapısı

System.Threading.SpinLock gibi Monitoryapısı, bir kilidin kullanılabilirliğine bağlı olarak paylaşılan kaynağa özel erişim verir. SpinLock Kullanılamayan bir kilidi almaya çalıştığında, bir döngüde bekler ve kilit kullanılabilir duruma gelene kadar sürekli olarak denetler.

Spin lock kullanmanın avantajları ve dezavantajları hakkında daha fazla bilgi için SpinLock makalesine ve API başvurusuna SpinLock bakın.

ReaderWriterLockSlim sınıfı

sınıfı System.Threading.ReaderWriterLockSlim , paylaşılan bir kaynağa yazma için özel erişim verir ve birden çok iş parçacığının okuma için kaynağa aynı anda erişmesine izin verir. İş parçacığı güvenli okuma işlemlerini destekleyen ancak yazma işlemini gerçekleştirmek için özel erişim gerektiren paylaşılan veri yapısına erişimi eşitlemek için kullanmak ReaderWriterLockSlim isteyebilirsiniz. Bir iş parçacığı özel erişim istediğinde (örneğin, yöntemini çağırarak ReaderWriterLockSlim.EnterWriteLock ), izleyen okuyucu ve yazıcı tüm mevcut okuyucular kilidinden çıkana ve yazıcı kilidi girip çıkana kadar engelleme ister.

Daha fazla bilgi için bkz ReaderWriterLockSlim . API başvurusu.

Semaphore ve SemaphoreSlim sınıfları

ve System.Threading.SemaphoreSlim sınıfları, System.Threading.Semaphore paylaşılan kaynağa veya bir kaynak havuzuna eşzamanlı olarak erişebilecek iş parçacığı sayısını sınırlar. Kaynağı isteyen ek iş parçacıkları, herhangi bir iş parçacığı semaforu serbest bırakana kadar bekler. Semaforda iş parçacığı benzitesi olmadığından, bir iş parçacığı semaforu alabilir ve başka bir iş parçacığı bunu serbest bırakabilir.

SemaphoreSlim için basit bir alternatiftir Semaphore ve yalnızca tek bir işlem sınırı içinde eşitleme için kullanılabilir.

Windows'da işlemler arası eşitleme için kullanabilirsiniz Semaphore . Bunu yapmak için, bir Semaphore ad veya yöntemi belirten Semaphore oluşturucularından birini kullanarak adlandırılmış sistem semaforunu Semaphore.OpenExisting temsil eden bir örnek oluşturun. SemaphoreSlim adlandırılmış sistem semaforlarını desteklemez.

Daha fazla bilgi için Semaphore ve SemaphoreSlim makalesine ve veya SemaphoreSlim API başvurusuna Semaphore bakın.

İş parçacığı etkileşimi veya sinyal

İş parçacığı etkileşimi (veya iş parçacığı sinyali), devam etmek için bir iş parçacığının bir veya daha fazla iş parçacığından bildirim veya sinyal beklemesi gerektiği anlamına gelir. Örneğin, A iş parçacığı B iş parçacığı yöntemini çağırırsa Thread.Join , A iş parçacığı B iş parçacığı tamamlanana kadar engellenir. Önceki bölümde açıklanan eşitleme ilkelleri, sinyal vermek için farklı bir mekanizma sağlar: bir kilit serbest bırakılarak, bir iş parçacığı başka bir iş parçacığına kilidi alarak ilerleyebileceğini bildirir.

Bu bölümde .NET tarafından sağlanan ek sinyal oluşturma yapıları açıklanmaktadır.

EventWaitHandle, AutoResetEvent, ManualResetEvent ve ManualResetEventSlim sınıfları

System.Threading.EventWaitHandle sınıfı bir iş parçacığı eşitleme olayını temsil eder.

Eşitleme olayı imzasız veya sinyalli durumda olabilir. Bir olayın durumu işaretsiz olduğunda, bir olay sinyal alınana kadar olayın WaitOne aşırı yüklemesini çağıran bir iş parçacığı engellenir. yöntemi, EventWaitHandle.Set bir olayın durumunu işaretlenmek üzere ayarlar.

Sinyal verilmiş bir EventWaitHandle kullanıcının davranışı sıfırlama moduna bağlıdır:

Windows'da işlemler arası eşitleme için kullanabilirsiniz EventWaitHandle . Bunu yapmak için, bir EventWaitHandle ad veya EventWaitHandle.OpenExisting yöntemi belirten EventWaitHandle oluşturucularından birini kullanarak adlandırılmış bir sistem eşitleme olayını temsil eden bir örnek oluşturun.

Daha fazla bilgi için EventWaitHandle makalesine bakın. API başvurusu için bkz. EventWaitHandle, AutoResetEvent, ManualResetEventve ManualResetEventSlim.

CountdownEvent sınıfı

sınıfı, System.Threading.CountdownEvent sayısı sıfır olduğunda ayarlanan bir olayı temsil eder. Sıfırdan CountdownEvent.CurrentCount büyük olsa da, çağıran CountdownEvent.Wait bir iş parçacığı engellenir. Bir olayın sayısını azaltma çağrısı CountdownEvent.Signal .

ManualResetEvent bir iş parçacığından gelen sinyalle birden çok iş parçacığının engellemesini kaldırmak için kullanabileceğiniz veya ManualResetEventSlimyerine, birden çok iş parçacığından gelen sinyallerle bir veya daha fazla iş parçacığının engellemesini kaldırmak için kullanabilirsinizCountdownEvent.

Daha fazla bilgi için CountdownEvent makalesine ve API başvurusuna CountdownEvent bakın.

Bariyer sınıfı

System.Threading.Barrier sınıfı bir iş parçacığı yürütme engelini temsil eder. yöntemini çağıran Barrier.SignalAndWait bir iş parçacığı, engele ulaştığını bildirir ve diğer katılımcı iş parçacıkları bariyere ulaşana kadar bekler. Tüm katılımcı iş parçacıkları bariyere ulaştığında devam eder ve bariyer sıfırlanır ve yeniden kullanılabilir.

Sonraki hesaplama aşamasına geçmeden önce bir veya daha fazla iş parçacığı diğer iş parçacıklarının sonuçlarını gerektirdiğinde kullanabilirsiniz Barrier .

Daha fazla bilgi için Engel makalesine ve API başvurusuna Barrier bakın.

Interlocked sınıfı

sınıfı, System.Threading.Interlocked bir değişken üzerinde basit atomik işlemler gerçekleştiren statik yöntemler sağlar. Bu atomik işlemler toplama, artırma ve azaltma, karşılaştırmaya bağlı olan exchange ve koşullu exchange ile 64 bit tamsayı değerinin okuma işlemini içerir.

Daha fazla bilgi için bkz Interlocked . API başvurusu.

SpinWait yapısı

Yapı, System.Threading.SpinWait döndürme tabanlı bekleme için destek sağlar. Bir iş parçacığının bir olayın işaretlenmesini veya bir koşulun karşılanmasını beklemesi gerektiğinde, ancak gerçek bekleme süresinin bekleme tutamacını kullanarak veya iş parçacığını başka bir şekilde engelleyerek gereken bekleme süresinden daha kısa olması beklendiğinde bunu kullanmak isteyebilirsiniz. kullanarak SpinWait, beklerken döndürmek için kısa bir süre belirtebilir ve ardından yalnızca koşul belirtilen sürede karşılanmadıysa (örneğin, bekleme veya uyku yoluyla) verim sağlayabilirsiniz.

Daha fazla bilgi için SpinWait makalesine ve API başvurusuna SpinWait bakın.

Ayrıca bkz.