.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.
Ç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.
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.
.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.
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 — ssukhpinder/30DayChallenge.Net
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