.Net bietet für alle atomaren Operationen ein leistungsstarkes Tool namens „Interlocked“-Klasse, mit dem Entwickler Konflikte reduzieren und die Leistung der Anwendung verbessern können.
In Anwendungsszenarien mit mehreren Threads kann die Verwendung herkömmlicher Sperrtechniken manchmal zu Leistungsengpässen bei atomaren Operationen führen. .Net bietet ein leistungsstarkes Tool namens „Interlocked“-Klasse für alle atomaren Operationen, mit dem Entwickler Konflikte reduzieren und die Leistung der Anwendung verbessern können.
Um die Thread-Sicherheit zu gewährleisten, wenn mehrere Threads auf eine gemeinsam genutzte Ressource zugreifen, verwenden Entwickler traditionell Sperren. Durch Sperren wird verhindert, dass mehrere Threads gleichzeitig auf einen kritischen Codeabschnitt zugreifen. Auf diese Weise wird sichergestellt, dass immer nur ein Thread die gemeinsam genutzte Ressource ändern kann.
private int _counter; private readonly object _syncRoot = new object(); public void IncrementCounter() { lock (_syncRoot) { _counter++; } }
Der oben genannte Ansatz birgt das Risiko potenzieller Leistungsprobleme, sogenannter Konflikte: Wenn mehrere Threads gleichzeitig versuchen, auf die Sperre zuzugreifen, werden sie angehalten, mit Ausnahme des Threads, der die Sperre erfolgreich erhält.
Das .NET-Framework bietet die Interlocked-Klasse als Teil des System.Threading-Namespace an, der für die effiziente Ausführung atomarer Operationen konzipiert ist. Atomare Operationen sind unteilbar; sie werden vollständig und ohne Unterbrechung ausgeführt.
private int _counter; public void IncrementCounter() { Interlocked.Increment(ref _counter); }
Da die Interlocked-Klasse keine Sperren erfordert, löst sie das im herkömmlichen Ansatz erwähnte Konfliktproblem.
Fügen Sie einen neuen Klassennamen IncrementClass hinzu und fügen Sie den folgenden Codeausschnitt hinzu
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); } }
Rufen Sie die Hauptmethode wie folgt auf:
#region Day 17: Increment Class IncrementClass.TestIncrementCounter(); #endregion
Konsolenausgabe:
Counter value: 10
GitHub – ssukhpinder/30DayChallenge.Net
Vielen Dank, dass Sie Teil der C#-Community sind! Bevor Sie gehen:
Folgen Sie uns: Youtube | X | LinkedIn | Dev.to Besuchen Sie unsere anderen Plattformen: GitHub