C# の lock ステートメント

Muhammad Maisam Abbas 2024年2月16日
C# の lock ステートメント

このチュートリアルでは、C# の lock ステートメントについて説明します。

C# の lock ステートメント

lock(obj) ステートメントは、コードの次のセクションにアクセスできないことを指定しています C# で同時に複数のスレッド。lock(obj) ステートメント内の obj パラメーターは、object クラスのインスタンスです。lock(obj) ステートメントは、C# でスレッドを管理する効率的な方法を提供します。lock(obj) 内のコードが 1つのスレッドによってアクセスされ、別のスレッドが同じコードにアクセスしたい場合、2 番目のスレッドは最初のスレッドがそれを実行するのを待つ必要があります。lock(obj) ステートメントは、コードの指定されたセクションの順次実行を保証します。この現象を示すために、最初に、lock(obj) ステートメントを使用してスレッド管理を行わずにコードの結果を示します。

using System;
using System.Threading;

namespace lock_statement {
  class Program {
    static readonly object lockname = new object();
    static void display() {
      for (int a = 1; a <= 3; a++) {
        Console.WriteLine("The value to be printed is: {0}", a);
      }
    }
    static void Main(string[] args) {
      Thread firstthread = new Thread(display);
      Thread secondthread = new Thread(display);
      firstthread.Start();
      secondthread.Start();
    }
  }
}

出力:

The value to be printed is: 1
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 2
The value to be printed is: 3

ご覧のとおり、スレッド firstthreadsecondthread はどちらもループ内のコードにランダムにアクセスします。lock(obj) ステートメントを使用したスレッド管理を使用したコードの結果を示します。

using System;
using System.Threading;

namespace lock_statement {
  class Program {
    static readonly object lockname = new object();
    static void display() {
      lock (lockname) {
        for (int a = 1; a <= 3; a++) {
          Console.WriteLine("The value to be printed is: {0}", a);
        }
      }
    }
    static void Main(string[] args) {
      Thread firstthread = new Thread(display);
      Thread secondthread = new Thread(display);
      firstthread.Start();
      secondthread.Start();
    }
  }
}

出力:

The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3
The value to be printed is: 1
The value to be printed is: 2
The value to be printed is: 3

今回は、ループ内のコードは、firstthreadsecondthread の両方から順番にアクセスされます。変数の値を変更するコードを lock(obj) ステートメント内に配置して、データの損失を防ぐことができます。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Csharp Thread