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にすることで、スレッドセーフでないオブジェクトに対する競合回避に使えます。
0 件のコメント:
コメントを投稿