paint-brush
30 日間の .NET チャレンジ - 17 日目: インターロック クラス ツールとは何ですか?@ssukhpinder
338 測定値
338 測定値

30 日間の .NET チャレンジ - 17 日目: インターロック クラス ツールとは何ですか?

Sukhpinder Singh4m2024/04/07
Read on Terminal Reader

長すぎる; 読むには

従来のロック技術を使用すると、アトミック操作のパフォーマンスのボトルネックが発生する場合があります。.Net は、すべてのアトミック操作に対して「Interlocked」クラスと呼ばれる強力なツールを提供します。これにより、開発者は競合を減らし、アプリケーションのパフォーマンスを向上させることができます。30 Day.Net Challenge では、開発者が Interlocked クラスの使用方法を学習することを課題としています。
featured image - 30 日間の .NET チャレンジ - 17 日目: インターロック クラス ツールとは何ですか?
Sukhpinder Singh HackerNoon profile picture
0-item
1-item
2-item

.Net は、すべてのアトミック操作に対して「Interlocked」クラスと呼ばれる強力なツールを提供しており、これにより開発者は競合を減らし、アプリケーションのパフォーマンスを向上させることができます。

導入

マルチスレッド アプリケーションのシナリオでは、従来のロック手法を使用すると、アトミック操作のパフォーマンスのボトルネックが発生することがあります。.NET では、すべてのアトミック操作に対して「Interlocked」クラスと呼ばれる強力なツールが提供されており、開発者はこれを使用して競合を減らし、アプリケーションのパフォーマンスを向上させることができます。

学習目標

  • ロックの問題
  • インターロックされたクラスの使用

開発者の前提条件

  • C#プログラミング言語の基本的な理解

30日間の.Netチャレンジ

はじめる

ロックの問題を理解する

従来、複数のスレッドが共有リソースにアクセスするときにスレッドの安全性を確保するために、開発者はロックを使用します。ロックにより、複数のスレッドが同時にコードの重要なセクションに入ることが防止され、一度に 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 の完全なコード

GitHub — ssukhpinder/30DayChallenge.Net

C# プログラミング🚀

C# コミュニティに参加していただきありがとうございます。終了する前に:

フォローしてください: Youtube | X | LinkedIn | Dev.to他のプラットフォームをご覧ください: GitHub