Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 18751|Yanıt: 0

[İpucu] C# Okuma/Yazma Kilidi OkuyucuYazarLockSlim kullanımı

[Bağlantıyı kopyala]
Yayınlandı 9.03.2017 16:59:19 | | | |
Okuma-yazma kilitleri kavramı basittir; birden fazla iş parçacığı aynı anda okuma kilitleri elde edebilir, ancak aynı anda yalnızca bir iş parçacığı yazma kilitleri elde edebilir, bu nedenle paylaşılan özel kilitler de denir. C#'da, okuma/yazma kilidi fonksiyonunu tamamlamak için ReaderWriterLockSlim sınıfını kullanmak önerilir.
Bazı durumlarda, bir nesneye yapılan okuma sayısı, değişikliklerin sayısından çok daha fazladır ve eğer sadece kilitle kilitlenirse, okuma verimliliği etkilenir. Okuma-yazma kilidi kullanılırsa, birden fazla iş parçacığı aynı anda nesneyi okuyabilir ve bu işlem yalnızca nesne yazma kilidi tarafından işgal edildiğinde engellenir.
Basitçe söylemek gerekirse, bir iş parçacığı okuma moduna geçtiğinde, diğer iş parçacıkları okuma moduna girebilir; eğer bir iş parçacığı o anda yazma moduna girmek isterse bloke edilmelidir. Okuma modu çıkana kadar.
Benzer şekilde, bir iş parçacığı yazma moduna geçerse, diğer iş parçacıkları yazmak ya da okumak istemelerine bakmadan engellenecektir.
Yazma/okuma moduna girmenin iki yolu vardır:
EnterReadLock, yazma modunun kilitleme durumuna girmeye çalışır.
TryEnterReadLock(Int32) okuma modu kilitleme durumuna girmeye çalışır ve tamsayı zaman aşımını seçme seçeneği sunar.
EnterWriteLock, Yazma Modu Kilidi durumuna girmeye çalışır.
TryEnterWriteLock(Int32) yazma modunun kilitleme durumuna girmeye çalışır ve zaman aşımına sahip zaman seçilebilir.
Yazma/okuma modundan çıkmanın iki yolu vardır:
ExitReadLock, okuma modunun özyinelemeli sayısını azaltır ve sonuç sayısı 0 (sıfır) olduğunda okuma modundan çıkar.
ExitWriteLock, yazma deseninin özyinelemeli sayısını azaltır ve sonuç sayısı 0 (sıfır) olduğunda yazma modundan çıkar.
İşte nasıl kullanılacağı:



Thread 3 ve thread 4'ün aynı anda okuma moduna girebildiğini, thread 5'in ise 5 saniye sonra (yani 3 ve 4 iplikler okuma kilidinden çıktıktan sonra) yazma moduna geçebildiğini görebilirsiniz.
Yukarıdaki kodu değiştirin, önce yazma modunda 2 iş parçacığı, sonra okuma modunda iş parçacıklarını açın, kod şu şekildedir:
      


Sonuçlar şu şekildedir:

Gördüğünüz gibi, iş parçacığı 3 ve iş parçacığı 4 ikisi de yazma moduna giriyor, ancak iş parçacığı 3 önce yazma kilidini işgal ediyor, bu yüzden iş parçacığı 4 giriş için 10 saniye beklemek zorunda. 5 ve 6 numaralı iş parçacıkları okuma kilidini işgal etmeli, bu yüzden devam etmeden önce 4. iplikin yazma kilidinden çıkmasını bekleyin.
TryEnterReadLock ve TryEnterWriteLock bir zaman aşımını ayarlayabilir, bu cümleye koşarken iş parçacığı burada bloklanır, eğer kilit o anda işgal edilebiliyorsa, sonra true döner, eğer zaman aşımına uğramış zaman henüz kilidi işgal etmemişse, false döner, kilidin işgalinden vazgeçer ve aşağıdaki kodu doğrudan çalıştırmaya devam eder.
EnterUpgradeableReadLock
ReaderWriterLockSlim sınıfı, okuma modundan farklı, EnterWriteLock veya TryEnterWriteLock yöntemleri çağrılarak yazma moduna yükseltilebilecek şekilde yükseltilebilir bir okuma modu sağlar. Çünkü aynı anda sadece bir thread yükseltilebilir modda olabilir. Yükseltilebilir moda giren bir iş parçacığı, okuma modundaki iş parçacığı etkilenmez; yani bir iş parçacığı yükseltilebilir moda geçtiğinde, herhangi bir iş parçacığı aynı anda okuma moduna girebilir ve engellenmez. Eğer birden fazla iş parçacığı zaten bir yazma kilidi elde etmeyi bekliyorsa, EnterUpgradeableReadLock çalıştırmak bu iş parçacıkları zamanın dolmamasına veya yazma kilidi çıkana kadar bloklanacaktır.
Aşağıdaki kod, yükseltilebilir okuma modunda yazma kilidi nasıl yükseltileceğini gösterir.



Okuma/yazma kilitlerinin performans üzerindeki etkisi açıktır.
Aşağıdaki test kodu:


Yukarıdaki kod, her biri bir iş parçacığı havuzu iş parçacığını kaplayan 500 Görevin operasyonunu simüle eder; bunların 20'si yazma iş parçacığı, 480'i ise okuma iş parçacığıdır. Veri okumak için 10 ms, kilit yöntemi ve ReaderWriterLockSlim yöntemini test etmek için yazmak 100 ms sürer. Bir tahmin yapılabilir; ReaderWriterLockSlim için, aynı anda 480 iş parçacağı okunursa, 10ms tüketir, 20 yazma işlemi 2000ms kaplar, yani 2010ms süren süredir ve sıradan kilitleme yöntemi için hepsi özel olduğu için 480 okuma işlemi 4800ms + 20 yazma işlemi 2000ms = 6800ms kaplar. Sonuçlar belirgin bir performans artışı gösterdi.






Önceki:Visual Studio 2017 offline kurulum paketi 18GB Baidu bulut indirme
Önümüzdeki:Struts2 sürümleri 2.2 ve 2.3'teki en yeni güvenlik açığı ve saldırı yöntemleri
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com