.Net, geliştiricilerin çekişmeyi azaltabileceği ve uygulamanın performansını artırabileceği tüm atomik işlemler için "Interlocked" sınıfı adı verilen güçlü bir araç sağlar.
giriiş
Çok iş parçacıklı uygulama senaryolarında, geleneksel kilitleme tekniklerinin kullanılması bazen atomik işlemlerde performans darboğazlarına neden olabilir. .Net, geliştiricilerin çekişmeyi azaltabileceği ve uygulamanın performansını artırabileceği tüm atomik işlemler için "Interlocked" sınıfı adı verilen güçlü bir araç sağlar.
Öğrenme hedefleri
- Kilitlerle ilgili sorun
- Kilitli sınıfları kullanma
Geliştiriciler için Önkoşullar
- C# programlama dilinin temel anlayışı
Başlarken
Kilitlerle İlgili Sorunu Anlamak
Geleneksel olarak, birden fazla iş parçacığı paylaşılan bir kaynağa eriştiğinde iş parçacığı güvenliğini sağlamak için geliştiriciler kilitler kullanır. Kilitleme, birden fazla iş parçacığının aynı anda kodun kritik bir bölümüne girmesini önler, böylece aynı anda yalnızca bir iş parçacığının paylaşılan kaynağı değiştirebilmesini sağlar.
private int _counter; private readonly object _syncRoot = new object(); public void IncrementCounter() { lock (_syncRoot) { _counter++; } }
Yukarıda belirtilen yaklaşım, çekişme adı verilen potansiyel bir performans sorunu riskini ortaya çıkarır; burada birden fazla iş parçacığı aynı anda kilide erişmeye çalıştığında, kilidi başarıyla alan iş parçacığı dışında bunlar beklemeye alınır.
Kilitli Sınıf: Daha İyi Bir Yol
.NET çerçevesi, atomik işlemleri verimli bir şekilde gerçekleştirmek için tasarlanmış System.Threading ad alanının bir parçası olarak Interlocked sınıfını sunar. Atomik işlemler bölünemez; tamamen kesintisiz olarak tamamlanırlar.
private int _counter; public void IncrementCounter() { Interlocked.Increment(ref _counter); }
Interlocked sınıfı kilit gerektirmediği için geleneksel yaklaşımda belirtildiği gibi çekişme sorununu çözer.
Tam Örnek
Yeni bir sınıf adı IncrementClass ekleyin ve aşağıdaki kod parçacığını ekleyin
public static class IncrementClass { private static int _counter = 0; /// <summary> /// Outputs /// Counter value: 10 /// </summary> public static void TestIncrementCounter() { // Create an array to hold the tasks Task[] tasks = new Task[10]; // Initialize and start tasks for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => IncrementCounter()); } // Wait for all tasks to complete Task.WaitAll(tasks); Console.WriteLine($"Counter value: {_counter}"); } public static void IncrementCounter() { // Safely increment the counter across multiple threads Interlocked.Increment(ref _counter); } }
Ana yöntemden aşağıdaki gibi çağrı yapın:
#region Day 17: Increment Class IncrementClass.TestIncrementCounter(); #endregion
Konsol çıkışı:
Counter value: 10
GitHub'da Kodu Tamamlayın
GitHub — ssukhpinder/30DayChallenge.Net
C# Programlama🚀
C# topluluğunun bir parçası olduğunuz için teşekkür ederiz! Sen ayrılmadan:
Bizi takip edin: Youtube | X | LinkedIn | Dev.to Diğer platformlarımızı ziyaret edin: GitHub