マルチスレッドの同時実行数を制御する SemaphoreSlimクラス

2023年2月27日月曜日

C#

t f B! P L

SemaphoreSlimについて

SemaphoreSlimは、.NET Framework および .NET に含まれるクラスの1つであり、スレッドの同期を行うために使用されます。このクラスを使用して、マルチスレッド処理の同時実行数を制御できます。

SemaphoreSlim は、セマフォのように動作します。つまり、指定された数のスレッドが同時にアクセスできるようにします。それ以外のスレッドは待機状態になります。SemaphoreSlim は、複数のスレッドが同時にアクセスすると競合状態が発生する可能性のあるリソースに対して非常に便利です。

SemaphoreSlimの使い方

まず、SemaphoreSlim のコンストラクタに同時に使用可能なスレッド数を指定する。

SemaphoreSlimは、Wait メソッドを呼び出すことで利用できます。このメソッドは、セマフォにアクセスするために待機するスレッドをブロックします。Release メソッドを呼び出すことで、セマフォを解放し、待機しているスレッドを開放します。

以下は、SemaphoreSlimを使用した例です。

SemaphoreSlim sem = new SemaphoreSlim(2);   // 同時に2つのスレッドがアクセスできるようにする
HttpClient client = new HttpClient();

Enumerable.Range(1, 100).Select(async page => {
  
  // リソースの使用を獲得。すでに他のTaskで2つ使用中の場合はここで解放されるまで待機
  sem.Wait();

  // 何らかの遅い処理(今回はHTTPアクセス)
  var res = await client.GetAsync($"https://exsample.com/page/{page}");

  // リソースの使用を解放
  sem.Release(); 

  return res;
});

この例では、最初の2つのスレッドがリソースにアクセスし、3つ目のスレッドは待機状態になります。スレッド1とスレッド2がリソースから離れた後、スレッド3がリソースにアクセスします。

SemaphoreSlim は、多くのスレッドが同時にリソースにアクセスする必要がある場合に非常に便利です。スレッドを効率的に同期することができ、競合状態を避けることができます。

リソースの排他に使える SemaphoreSlim

SemaphoreSlim は、リソースの利用可能性(排他制御)するために使用されるクラスです。今回紹介したようなスレッドの同時実行数の制御に用いたり、リソースの排他制御に使うことができます。例えば、SemaphoreSlimの同時使用数を1にすることで、スレッドセーフでないオブジェクトに対する競合回避に使えます。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ