Çoklu iş parçacığı kullanımı için verileri eşitleme
Birden çok iş parçacığı tek bir nesnenin özelliklerine ve yöntemlerine çağrı yapabilirse, bu çağrıların eşitlenmesi kritik önem taşır. Aksi takdirde bir iş parçacığı başka bir iş parçacığının ne yaptığını kesintiye uğratabilir ve nesne geçersiz bir durumda bırakılabilir. Üyeleri bu tür kesintilere karşı korunan bir sınıfa iş parçacığı güvenli denir.
.NET, örneğe ve statik üyelere erişimi eşitlemek için çeşitli stratejiler sağlar:
Eşitlenmiş kod bölgeleri. Yalnızca ihtiyacı olan kod bloğunu Monitor eşitlemek ve performansı artırmak için bu sınıf için sınıf veya derleyici desteğini kullanabilirsiniz.
El ile eşitleme. .NET sınıf kitaplığı tarafından sağlanan eşitleme nesnelerini kullanabilirsiniz. Bkz. Sınıfın tartışmasını içeren Eşitleme Temel BilgilerineMonitor Genel Bakış.
Eşitlenmiş bağlamlar. Yalnızca .NET Framework ve Xamarin uygulamaları için, nesneleri için basit, otomatik eşitlemeyi etkinleştirmek için ContextBoundObject öğesini SynchronizationAttribute kullanabilirsiniz.
Ad alanında System.Collections.Concurrent koleksiyon sınıfları. Bu sınıflar, yerleşik eşitlenmiş ekleme ve kaldırma işlemleri sağlar. Daha fazla bilgi için bkz. İş Parçacığı Kasa Koleksiyonları.
Ortak dil çalışma zamanı, sınıfların gereksinimlere bağlı olarak çeşitli yollarla eşitlenebilen çeşitli kategorilere ayrıldığı bir iş parçacığı modeli sağlar. Aşağıdaki tabloda, belirli bir eşitleme kategorisine sahip alanlar ve yöntemler için hangi eşitleme desteğinin sağlandığı gösterilmektedir.
Kategori | Genel alanlar | Statik alanlar | Statik yöntemler | Örnek alanları | Örnek yöntemleri | Belirli kod blokları |
---|---|---|---|---|---|---|
Eşitleme Yok | Hayır | Hayır | Hayır | Hayır | Hayır | Hayır |
Eşitlenmiş Bağlam | Hayır | Hayır | Hayır | Evet | Evet | Hayır |
Eşitlenmiş Kod Bölgeleri | Hayır | Hayır | Yalnızca işaretliyse | Hayır | Yalnızca işaretliyse | Yalnızca işaretliyse |
El ile Eşitleme | El ile | El ile | El ile | El ile | El ile | El ile |
Eşitleme yok
Bu, nesneler için varsayılan değerdir. Herhangi bir iş parçacığı herhangi bir zaman herhangi bir yönteme veya alana erişebilir. Bu nesnelere aynı anda yalnızca bir iş parçacığı erişmelidir.
El ile eşitleme
.NET sınıf kitaplığı, iş parçacıklarını eşitlemek için bir dizi sınıf sağlar. Bkz. Eşitleme Temel Bilgilerine Genel Bakış.
Eşitlenmiş kod bölgeleri
Kod bloklarını Monitor , örnek yöntemlerini ve statik yöntemleri eşitlemek için sınıfını veya derleyici anahtar sözcüğünü kullanabilirsiniz. Eşitlenmiş statik alanlar için destek yoktur.
Hem Visual Basic hem de C#, kod bloklarının belirli bir dil anahtar sözcüğüyle, lock
C# içindeki deyimiyle veya Visual Basic'teki deyimiyle işaretlenmesine SyncLock
destek olur. Kod bir iş parçacığı tarafından yürütülürken, kilidi almak için bir girişim yapılır. Kilit zaten başka bir iş parçacığı tarafından alınmışsa, iş parçacığı kilit kullanılabilir duruma gelene kadar engeller. İş parçacığı eşitlenmiş kod bloğundan çıktığında, iş parçacığı blokta nasıl çıksa da kilit serbest bırakılır.
Not
C# 13'den başlayarak, lock
deyimi kilitli nesnenin bir örneği System.Threading.Lock olup olmadığını tanır ve eşitlenmiş bir bölge oluşturmak için yöntemini kullanır EnterScope
. lock
hedef bir Lock
örnek olmadığında ve SyncLock
deyimleri ve Monitor.Exitkullanılarak Monitor.Enter uygulandığında, diğer yöntemleri Monitor eşitlenmiş bölge içinde bunlarla birlikte kullanılabilir.
Ayrıca, yöntemini kullanarak veya derleyici anahtar sözcüklerinden birini kullanarak Monitor aynı etkiye sahip olan değeriyle MethodImplAttributeMethodImplOptions.Synchronizedveya yöntemin tüm gövdesini kilitlemek için derleyici anahtar sözcüklerinden biriyle süsleyebilirsiniz.
Thread.Interrupt bir iş parçacığını kodun eşitlenmiş bir bölgesine erişim bekleme gibi engelleme işlemlerinden ayırmak için kullanılabilir. Thread.Interrupt , iş parçacıklarını gibi Thread.Sleepişlemlerden ayırmak için de kullanılır.
Önemli
Yöntemleri (Shared
Visual Basic'teki yöntemler) korumak static
için türü ( typeof(MyType)
C# dilinde, GetType(MyType)
Visual Basic'te veya MyType::typeid
C++'da) kilitlemeyin. Bunun yerine özel bir statik nesne kullanın. Benzer şekilde, örnek yöntemlerini kilitlemek için C# içinde (Me
Visual Basic'te) kullanmayınthis
. Bunun yerine özel bir nesne kullanın. Bir sınıf veya örnek kendi kodunuz dışında bir kodla kilitlenebilir ve kilitlenmelere veya performans sorunlarına neden olabilir.
Derleyici desteği
Hem Visual Basic hem de C# nesnesini kilitlemek için ve Monitor.Exit kullanan Monitor.Enter bir dil anahtar sözcüğünü destekler. Visual Basic SyncLock deyimini destekler; C# lock deyimini destekler.
Her iki durumda da kod bloğunda bir özel durum oluşursa, kilit veya SyncLock tarafından alınan kilit otomatik olarak serbest bırakılır. C# ve Visual Basic derleyicileri, denemenin/başında Monitor.Enter ve finally bloğunda Monitor.Exit ile bir try finally bloğu yayar. Kilit veya SyncLock bloğu içinde bir özel durum oluşursa, finally işleyicisi herhangi bir temizleme işi yapmanıza olanak sağlamak için çalışır.
Eşitlenmiş Bağlam
Yalnızca .NET Framework ve Xamarin uygulamalarında, tüm örnek yöntemlerini ve alanlarını eşitlemek için herhangi bir ContextBoundObject üzerinde kullanabilirsinizSynchronizationAttribute. Aynı bağlam etki alanındaki tüm nesneler aynı kilidi paylaşır. Yöntemlere ve alanlara birden çok iş parçacığının erişmesine izin verilir, ancak tek seferde yalnızca tek bir iş parçacığına izin verilir.