Ç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:

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 . lockhedef 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 (SharedVisual 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 (MeVisual 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.

Ayrıca bkz.