Normal koşullarda, çok iş parçacıklı programlama olduğu sürece programın karmaşıklığı önemli ölçüde artar, performans önemli ölçüde azalır ve hata olasılığı büyük ölçüde artar.
Çok iplikli programlama, veri işleme yeteneklerini artırmak için paralel çalıştırmak için tasarlanmıştır, ancak çoğu durumda paylaşılan kaynaklar için rekabet gerektirir, bu nedenle kaynak nesneleri değiştirilirken kilitlenmelidir. Ancak, kilitleri uygulamanın birçok yolu var, bu yüzden C#'da birkaç kilit türünün uygulanması ve performansına bir göz atalım.
Kilitleri kullanmanın birkaç yolu
1. Atomik kilitleme
Interlocked atomik operasyonu ile "kilitsiz" rekabet elde edin. Karşılaştırın.
Resmi açıklama, birden fazla iş parçacığı tarafından paylaşılan değişkenler için atomik işlemler sağlamaktır. İsim Alanı: System.Threading
2. Kritik alan
Birden fazla iş parçacığının seri olarak oluşturulması ve genel kaynaklara veya bir kod parçasına erişmek hızlıdır ve veri erişimini kontrol etmek için uygundur. C#'daki kilit sözdizimi, kritik alan (Monitör) için bir sözdizimi şekeridir.
3. Atomik çalışma
Atomik işlemler, ki bunlar özel bir durumdur, doğası gereği iplik açısından güvenlidir, bu yüzden onları kilitlemeye gerek yoktur.
Resmi olarak verilen bir değişkenin değerini atomik bir işlem şeklinde artırıp sonucu depolamak şeklinde yorumlanır. İsim Alanı: System.Threading
4. Kilidi okuma ve yazma
Okuma-yazma kilitleri, diğer programlar yazarken kaynakları okumaya izin verir, bu yüzden kaynak kirli okumalara izin verirse bu daha uygundur.
Resmi açıklama, kaynak erişimini yönetmek için kullanılan kilitli bir durumu belirtir; bu durum çok iş parçacıklı okuma veya özel yazma erişimi sağlar. Isim alanı System.Threading'dir
5. Semafor
Semaforlar, sınırlı sayıda kullanıcı kaynağını kontrol etmek için tasarlanmıştır.
Resmi açıklama, aynı anda bir kaynak veya kaynak havuzuna erişebilen iş parçacıklarının sayısını sınırlar. Isim alanı System.Threading'dir
6. Etkinlikler
Bazı olayların gerçekleştiğini iş parçacığına bildirmek için kullanılır, ardından bir sonraki görevin başlangıcını başlatır.
Resmi açıklama, iş parçacağı senkronizasyonu olaylarının bir iş parçacağı serbest bırakıldıktan sonra sinyal alındığında otomatik olarak sıfırlandığını belirtir. Bu tür tipler miras alınamaz.
7. Karşılıklı dışlama
C#'da System.Threading isim alanının hemen altında bir Mutex sınıfı vardır; Mutex aslında bir mutex'tir; sadece birden fazla iş parçacığı arasındaki kaynak rekabetini değil, süreçler arasındaki kaynak rekabetini de yönetebilir.
Performans test kodu
Kodu çalıştır
Performans testi sonuçları
Not: Yukarıdaki veriler yalnızca mevcut test ortamının donanım performansının sonucudur ve yalnızca birbirleriyle karşılaştırılabilir.
1) Çeşitli testlerde kilitlenmemek kesinlikle en hızlı yöntemdir, bu yüzden kilitli çalışmaya yol açan kaynak rekabetinden kaçınmaya çalışın.
2) Interlocked. CompareExchange çoklu iş parçacığı çalışmasında sürekli üstün performans sergileyerek ikinci sırada yer alıyor.
3) Üçüncü kilit, kritik bölge de iyi performans gösteriyor, bu yüzden kilitlenme performansının düşük olduğunu söylediklerinde lütfen reddet.
4) Dördüncü yer atomik değişken (Atomik) işlemdir, ancak şu anda sadece değişkenlerin kendi kendine artması ve çıkarılması desteklenir ve uygulanabilirliği güçlü değildir.
5) Beşinci okuma/yazma kilidi (ReaderWriterLockSlim) performansı da fena değil, hiçbir şey okumayı destekliyor ve pratikliği hâlâ nispeten iyi.
6) Kalan semaforlar, olaylar ve muteksler en kötü performansa sahip, elbette kendi uygulama alanları vardır ama kaynak rekabetiyle başa çıkmada iyi performans göstermezler.
Orijinal bağlantı adresi:Bağlantı girişi görünür.
|