Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.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, iş parçacığı etkileşimi için bir sinyal mekanizması kullanan ve yerel bir işletim sistemi eşitleme tutamacını kapsayan System.Threading.WaitHandle 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 mutex'e hiçbir iş parçacığı sahip değilse, durumu işaret edilmiş olur.
- 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 sinyalsiz durumda olabilir.
- System.Threading.AutoResetEvent, EventWaitHandle'den türetilir ve sinyal verildiğinde, tek bir bekleyen iş parçacığı serbest bırakıldıktan sonra otomatik olarak sinyalsiz duruma sıfırlanır.
- System.Threading.ManualResetEvent, EventWaitHandle'den türetilir ve sinyal gönderildiğinde, Reset yöntemi çağrılana kadar sinyalli durumda kalır.
.NET Framework'te, WaitHandle, System.MarshalByRefObject türünden türetildiği için, bu türler, iş parçacıklarının etkinliklerini, uygulama etki alanı sınırları arasında 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:
- Mutex
- Semaphore (Windows'da)
- EventWaitHandle (Windows'da)
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, Semaphore için hafif bir alternatiftir.
Paylaşılan kaynağa erişimi eşitleme
.NET, paylaşılan bir kaynağa birden çok iş parçacığı tarafından erişimi kontrol etmek için bir dizi eşzamanlama ilkeleri sağlar.
İzleyici sınıfı
System.Threading.Monitor sınıfı, kaynağı belirleyen nesne üzerinde bir kilidi alarak veya serbest bırakarak paylaşılan kaynağa karşılıklı olarak özel erişim verir. Bir kilit tutulurken, kilidi tutan iş parçacığı kilidi tekrar alabilir ve serbest bırakabilir. 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 iş parçacığının bir kilidi almaya çalıştığı süreyi belirlemek için Monitor.TryEnter yöntemini kullanabilirsiniz. Sınıfın Monitor iş parçacığı benzitesi olduğundan kilidi alan iş parçacığının, Monitor.Exit yöntemini çağırarak kilidi serbest bırakması gerekir.
Aynı nesne üzerinde kilit alan iş parçacıklarının etkileşimini Monitor.Wait, Monitor.Pulse ve Monitor.PulseAll yöntemlerini kullanarak koordine edebilirsiniz.
Daha fazla bilgi için bkz Monitor . API başvurusu.
Uyarı
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, Enter ve Exit yöntemleri ile bir try…finally blok kullanılarak uygulanır; bu, alınan kilidin her zaman serbest bırakılmasını sağlar.
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ığı bağımlılığına sahiptir ve bir mutex alan iş parçacığının Mutex.ReleaseMutex yöntemini çağırarak serbest bırakması gerekir.
Monitor yerine, Mutex sınıfı işlemler arası eşitleme için kullanılabilir. Özel adlandırılmış bir mutex kullanarak bunu yapın, bu mutex işletim sistemi genelinde görünür. Adlandırılmış bir mutex örneği oluşturmak için, bir ad belirten bir Mutex oluşturucu kullanın. Mevcut adlandırılmış bir sistem mutex'ini açmak için Mutex.OpenExisting 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. Paylaşılan veri yapısına erişimi, iş parçacığı güvenli okuma işlemlerini desteklemek için senkronize etmek isteyebilirsiniz, ancak yazma işlemini gerçekleştirmek için özel erişim gerektirir. Bu amaçla ReaderWriterLockSlim kullanabilirsiniz. Bir iş parçacığı özel erişim istediğinde (örneğin, ReaderWriterLockSlim.EnterWriteLock yöntemini çağırarak), izleyen okuyucu ve yazıcı istekleri, mevcut tüm okuyucular kilitten çıkana ve yazıcı kilide girip çıkana kadar engellenir.
Daha fazla bilgi için bkz ReaderWriterLockSlim . API başvurusu.
Semaphore ve SemaphoreSlim sınıfları
ve System.Threading.Semaphore sınıfları, System.Threading.SemaphoreSlim paylaşılan kaynağa veya bir kaynak havuzuna eşzamanlı olarak erişebilecek iş parçacığı sayısını sınırlar. Kaynağı talep eden ek iş parçacıkları, herhangi bir iş parçacığı semaforu serbest bırakana kadar bekler. Semaforun iş parçacılarıyla doğrudan bir bağlantısı olmadığından, bir iş parçacığı semaforu edinebilir ve başka bir iş parçacığı 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, ad belirtilen bir Semaphore sistem semaforunu temsil eden bir örnek oluşturun; bunu, Semaphore oluşturucularından birini veya Semaphore.OpenExisting yöntemini kullanarak gerçekleştirin. SemaphoreSlim adlandırılmış sistem semaforlarını desteklemez.
Daha fazla bilgi için Semaphore ve SemaphoreSlim makalesine ve Semaphore veya SemaphoreSlim API başvurusuna bakın.
İş parçacığı etkileşimi veya sinyal gönderimi
İş 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ığının Thread.Join yöntemini çağırırsa, A iş parçacığı, B iş parçacığı tamamlanana kadar engellenir. Önceki bölümde belirtilen senkronizasyon ilkelleri, sinyal vermek için farklı bir mekanizma sağlar: Bir kilit serbest bırakıldığında, bir iş parçacığı diğer iş parçacığını kilidi alarak ilerleyebileceği konusunda bilgilendirir.
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ı ya sinyalsiz ya da 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'nün davranışı, sıfırlama moduna bağlıdır.
- Bir EventWaitHandle, EventResetMode.AutoReset bayrağıyla oluşturulduğunda, tek bir bekleyen iş parçacığı serbest bırakıldıktan sonra otomatik olarak sıfırlanır. Her sinyal geldiğinde yalnızca bir iş parçacığının geçmesine izin veren bir turnike gibidir. System.Threading.AutoResetEvent sınıfı, EventWaitHandle sınıfından türetilmiş olup bu davranışı temsil eder.
- EventWaitHandle ile EventResetMode.ManualReset bayrağı kullanılarak oluşturulan, Reset yöntemi çağrılana kadar sinyalli olarak kalır. Sinyal gelene kadar kapalı olan ve birisi kapatana kadar açık kalan bir kapı gibi. System.Threading.ManualResetEvent sınıfı, EventWaitHandle sınıfından türetilmiş olup bu davranışı temsil eder. System.Threading.ManualResetEventSlim sınıfı, ManualResetEvent için hafif bir alternatiftir.
Windows'da işlemler arası eşitleme için kullanabilirsiniz EventWaitHandle . Bunu yapmak için, bir EventWaitHandle ad veya yöntemi belirten EventWaitHandle.OpenExisting 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. CountdownEvent.CurrentCount sıfırdan büyük olduğu sürece, CountdownEvent.Wait çağıran bir iş parçacığı engellenir. Bir olayın sayısını azaltmak için CountdownEvent.Signal işlevini çağırın.
ManualResetEvent veya ManualResetEventSlim yerine, birden çok iş parçacığından gelen sinyallerle bir veya daha fazla iş parçacığının engellemesini kaldırmak için CountdownEvent kullanabilirsiniz. Bunun aksine, bir iş parçacığından gelen sinyalle birden çok iş parçacığının engellemesini kaldırmak için kullanabilirsiniz.
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 thread çalıştırma bariyerini temsil eder. Barrier.SignalAndWait yöntemini çağıran bir iş parçacığı, engeli aştığını bildirerek diğer katılımcı iş parçacıklarının da bu engeli aşmasını bekler. Tüm katılımcı iş parçacıkları bariyere ulaştığında, ilerler ve bariyer sıfırlanarak yeniden kullanılabilir hale gelir.
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.
Kilitlenmiş 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ı olarak değişim ve koşullu değişim 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. SpinWait kullanarak, beklerken dönmek için kısa bir süre belirleyebilir ve koşul belirtilen sürede karşılanmadıysa, ancak o zaman (örneğin bekleme veya uyuma şeklinde) duraklayabilirsiniz.
Daha fazla bilgi için SpinWait makalesine ve API başvurusuna SpinWait bakın.