Ç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 kesintilerden etkilenmeyen bir sınıf, iş parçacığı açısından güvenli olarak adlandırılır.

.NET, örnek ve statik üyelere erişimi eşitlemek için çeşitli stratejiler sağlar:

  • Eşitlenmiş kod bölgeleri. Yalnızca buna ihtiyaç duyan kod bloğunu eşitleyerek performansı artırmak için Monitor sınıfını veya bu sınıfa yönelik derleyici desteğini kullanabilirsiniz.

  • El ile eşitleme. .NET sınıf kitaplığı tarafından sağlanan eşitleme nesnelerini kullanabilirsiniz. Bkz. Eşitleme İlkellerine Genel Bakış; bu konu Monitor sınıfının da ele alındığı bir açıklama içerir.

  • Senkronize bağlamlar. Yalnızca .NET Framework uygulamaları için, ContextBoundObject nesneleri için basit ve otomatik eşitlemeyi etkinleştirmek üzere SynchronizationAttribute öğesini kullanabilirsiniz.

  • System.Collections.Concurrent ad alanındaki 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. Thread-Safe 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.

Category Genel alanlar Statik alanlar Statik yöntemler Örnek alanlar Örnek yöntemler Belirli kod blokları
Eşitleme Yok Hayır Hayır Hayır Hayır Hayır Hayır
Senkronize Bağlam Hayır Hayır Hayır Yes Yes Hayır
Eşitlenmiş Kod Bölgeleri Hayır Hayır Yalnızca işaretliyse Hayır Yalnızca işaretlenmişse Yalnızca işaretlenmişse
El ile Eşitleme Manual Manual Manual Manual Manual Manual

Eşitleme yok

Bu, nesneler için varsayılan değerdir. Herhangi bir iş parçacığı, herhangi bir anda herhangi bir metoda 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çok sınıf sunar. Bkz. Eşitleme Temel Bilgilerine Genel Bakış.

Eşitlenmiş kod bölgeleri

Kod bloklarını, örnek yöntemleri ve statik yöntemleri senkronize etmek için Monitor sınıfını veya bir 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 işaretlenmesini destekler; bu, C#'ta lock deyimi veya Visual Basic'te SyncLock deyimiyle yapılır. 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 serbest kalana kadar bloke olur. İş parçacığı senkronize kod bloğundan çıktığında, bloktan nasıl çıkarsa çıksın kilit bırakılır.

Note

.NET 9 ve C# 13 ve sonrasında, lock hedefi ayrılmış bir System.Threading.Lock örneğiyse, lock deyimi eşzamanlı bir bölge oluşturmak için Lock.EnterScope() kullanır.

Visual Basic, SyncLock içinde System.Threading.Lock öğesini desteklemez; bu nedenle ayrı bir özel başvuru türüyle SyncLock kullanmaya devam edin.

lock hedef bir Lock örneği değilse, derleyici tüm SyncLock kullanımlarında Monitor.Enter ve Monitor.Exit kullanır. Bu uygulama nedeniyle eşitlenmiş bölgedeki diğer Monitor yöntemleri kullanmaya devam edebilirsiniz.

Ayrıca, bir yöntemi MethodImplOptions.Synchronized değerine sahip bir MethodImplAttribute ile süsleyebilirsiniz; bu, yöntemin tüm gövdesini kilitlemek için Monitor veya derleyici anahtar sözcüklerinden birini kullanmakla aynı etkiye sahiptir.

Thread.Interrupt, bir iş parçacığını eşzamanlanmış bir kod bölgesine erişmeyi bekleme gibi engelleyici işlemlerden çıkarmak için kullanılabilir. Thread.Interrupt, iş parçacıklarını Thread.Sleep gibi işlemlerden çıkarmak için de kullanılır.

Important

static yöntemlerini korumak için (Visual Basic'te Shared yöntemleri), türü kilitlemeyin; yani C#'ta typeof(MyType), Visual Basic'te GetType(MyType) veya C++'ta MyType::typeid kullanmayın. Bunun yerine özel bir statik nesne kullanın. Benzer şekilde, örnek yöntemlerini kilitlemek için C#'ta this (Visual Basic'te Me) kullanmayın. 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#, nesneyi kilitlemek için Monitor.Enter ve Monitor.Exit kullanan 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şturulursa, lock veya SyncLock tarafından edinilen kilit otomatik olarak bırakılır. C# ve Visual Basic derleyicileri, try bloğunun başında Monitor.Enter ve finally bloğunda Monitor.Exit bulunan bir try/finally bloğu oluşturur. 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.

Senkronize Bağlam

Yalnızca .NET Framework uygulamalarında, tüm örnek yöntemlerini ve alanlarını senkronize etmek için SynchronizationAttribute herhangi bir ContextBoundObject üzerinde kullanabilirsiniz. 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 bakınız