.Net は、すべてのアトミック操作に対して「Interlocked」クラスと呼ばれる強力なツールを提供しており、これにより開発者は競合を減らし、アプリケーションのパフォーマンスを向上させることができます。
マルチスレッド アプリケーションのシナリオでは、従来のロック手法を使用すると、アトミック操作のパフォーマンスのボトルネックが発生することがあります。.NET では、すべてのアトミック操作に対して「Interlocked」クラスと呼ばれる強力なツールが提供されており、開発者はこれを使用して競合を減らし、アプリケーションのパフォーマンスを向上させることができます。
従来、複数のスレッドが共有リソースにアクセスするときにスレッドの安全性を確保するために、開発者はロックを使用します。ロックにより、複数のスレッドが同時にコードの重要なセクションに入ることが防止され、一度に 1 つのスレッドだけが共有リソースを変更できるようになります。
private int _counter; private readonly object _syncRoot = new object(); public void IncrementCounter() { lock (_syncRoot) { _counter++; } }
前述のアプローチでは、競合と呼ばれる潜在的なパフォーマンス問題が発生するリスクがあります。競合とは、複数のスレッドが同時にロックにアクセスしようとすると、ロックを正常に取得したスレッドを除いて、それらのスレッドが保留されることです。
.NET フレームワークは、アトミック操作を効率的に実行するように設計された、System.Threading 名前空間の一部として Interlocked クラスを提供します。アトミック操作は分割不可能であり、中断されることなく完全に完了します。
private int _counter; public void IncrementCounter() { Interlocked.Increment(ref _counter); }
Interlocked クラスはロックを必要としないため、従来のアプローチで述べた競合の問題を解決します。
新しいクラス名IncrementClassを追加し、次のコードスニペットを追加します。
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); } }
次のようにメイン メソッドから呼び出します。
#region Day 17: Increment Class IncrementClass.TestIncrementCounter(); #endregion
コンソール出力:
Counter value: 10
GitHub — ssukhpinder/30DayChallenge.Net
C# コミュニティに参加していただきありがとうございます。終了する前に:
フォローしてください: Youtube | X | LinkedIn | Dev.to他のプラットフォームをご覧ください: GitHub