エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Semaphore クラス

2013/12/12

リソースまたはリソースのプールに同時にアクセスできるスレッドの数を制限します。

System.Object
  System.Threading.WaitHandle
    System.Threading.Semaphore

Namespace:  System.Threading
アセンブリ:  System (System.dll 内)

'宣言
Public NotInheritable Class Semaphore _
	Inherits WaitHandle

Semaphore 型で公開されるメンバーは以下のとおりです。

  名前説明
パブリック メソッドSemaphore(Int32, Int32)同時実行エントリの最大数を指定し、オプションでエントリをいくつか予約して、Semaphore クラスの新しいインスタンスを初期化します。
パブリック メソッドSemaphore(Int32, Int32, String)セキュリティ クリティカル。 同時実行エントリの最大数を指定し、オプションで呼び出し元スレッド用にエントリをいくつか予約し、オプションでシステム セマフォ オブジェクトの名前を指定して、Semaphore クラスの新しいインスタンスを初期化します。
パブリック メソッドSemaphore(Int32, Int32, String, Boolean)セキュリティ クリティカル。 同時実行エントリの最大数を指定し、オプションで呼び出し元スレッド用にエントリをいくつか予約し、オプションでシステム セマフォ オブジェクトの名前を指定し、新しいシステム セマフォが作成されたかどうかを示す値を受け取る変数を指定して、Semaphore クラスの新しいインスタンスを初期化します。
このページのトップへ

  名前説明
パブリック プロパティSafeWaitHandleネイティブ オペレーティング システム ハンドルを取得または設定します。 (WaitHandle から継承されます。)
このページのトップへ

  名前説明
パブリック メソッドClose派生クラスでオーバーライドされると、現在の WaitHandle で保持されているすべてのリソースを解放します。 (WaitHandle から継承されます。)
パブリック メソッドDisposeWaitHandle クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。 (WaitHandle から継承されます。)
プロテクト メソッドDispose(Boolean)派生クラスでオーバーライドされると、WaitHandle によって使用されているアンマネージ リソースを解放し、オプションでマネージ リソースも解放します。 (WaitHandle から継承されます。)
パブリック メソッドEquals(Object)指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)
プロテクト メソッドFinalizeObject がガベージ コレクションで再利用される前に、Object がリソースを解放して他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)
パブリック メソッドGetHashCode特定の型のハッシュ関数として機能します。 (Object から継承されます。)
パブリック メソッドGetType現在のインスタンスの Type を取得します。 (Object から継承されます。)
プロテクト メソッドMemberwiseClone現在の Object の簡易コピーを作成します。 (Object から継承されます。)
パブリック メソッド静的メンバーOpenExistingセキュリティ クリティカル。 指定された名前付きセマフォが既に存在する場合は、そのセマフォを開きます。
パブリック メソッドReleaseセマフォから出て、前のカウントを返します。
パブリック メソッドRelease(Int32)指定した回数だけセマフォから出て、前のカウントを返します。
パブリック メソッドToString現在のオブジェクトを表す文字列を返します。 (Object から継承されます。)
パブリック メソッド静的メンバーTryOpenExistingセキュリティ クリティカル。 指定された名前付きセマフォが既に存在する場合はそのセマフォを開き、操作が成功したかどうかを示す値を返します。
パブリック メソッドWaitOne現在の WaitHandle が信号を受信するまで、現在のスレッドをブロックします。 (WaitHandle から継承されます。)
パブリック メソッドWaitOne(Int32)32 ビット符号付き整数を使用して時間間隔を指定し、現在の WaitHandle がシグナルを受信するまで、現在のスレッドをブロックします。 (WaitHandle から継承されます。)
パブリック メソッドWaitOne(TimeSpan)TimeSpan を使用して時間間隔を指定し、現在のインスタンスがシグナルを受信するまで、現在のスレッドをブロックします。 (WaitHandle から継承されます。)
このページのトップへ

リソースのプールへのアクセスを制御するには、Semaphore クラスを使用します。スレッドは、WaitHandle クラスから継承された WaitOne メソッドを呼び出すことによってセマフォに入り、Release メソッドを呼び出すことによってセマフォを解放します。

セマフォのカウントは、1 つのスレッドがセマフォに入るたびにデクリメントされ、1 つのスレッドがセマフォを解放するたびにインクリメントされます。カウントが 0 になると、それ以降の要求は他のスレッドがセマフォを解放するまでブロックされます。すべてのスレッドがセマフォを解放すると、カウントはセマフォの作成時に設定された最大値になります。

ブロックされたスレッドがセマフォに入る際、FIFO または LIFO のような保証された順序はありません。

WaitOne メソッドを繰り返し呼び出すと、1 つのスレッドが複数回セマフォに入ることができます。このようなエントリの一部またはすべてを解放するには、スレッドでパラメーターなしの Release メソッド オーバーロードを複数回呼び出すか、または、解放するエントリの数を指定する Release(Int32) メソッド オーバーロードを呼び出します。

Semaphore クラスは、WaitOne または Release の呼び出しにスレッドの ID を適用しません。プログラマは、スレッドがセマフォを必要な回数以上、解放しないように注意する必要があります。たとえば、あるセマフォのカウントの最大値が 2 で、スレッド A およびスレッド B が両方ともこのセマフォに入ったとします。スレッド B のプログラミング エラーによって Release が 2 回呼び出された場合、呼び出しは 2 回とも成功します。セマフォはカウントの最大値に達し、最終的にスレッド A が Release を呼び出すと、SemaphoreFullException がスローされます。

セマフォには、次の 2 種類があります。ローカル セマフォと名前付きシステム セマフォ。名前を受け入れるコンストラクターを使用して Semaphore オブジェクトを作成した場合、オブジェクトはその名前のオペレーティング システム セマフォに関連付けられます。名前付きシステム セマフォはオペレーティング システム全体から参照でき、プロセスの動作を同期するために使用できます。同じ名前付きシステム セマフォを表す複数の Semaphore オブジェクトを作成できます。また、OpenExisting メソッドを使用すると、既存の名前付きシステム セマフォを開くことができます。

ローカル セマフォは該当するプロセス内のみに存在します。これは、ローカル Semaphore オブジェクトへの参照を持つプロセス内のすべてのスレッドで使用できます。各 Semaphore オブジェクトは個別のローカル セマフォです。

カウントの最大値が 3 で初期カウントが 0 のセマフォを作成するコード例を次に示します。この例では 5 つのスレッドが開始され、ブロックされてセマフォを待機します。メイン スレッドが Release(Int32) メソッド オーバーロードを使用してセマフォのカウントを最大値まで増加させ、3 つのスレッドがセマフォに入ることができるようにします。各スレッドは、動作をシミュレートするために Thread.Sleep メソッドを使用して 1 秒間待機し、その後 Release メソッド オーバーロードを呼び出してセマフォを解放します。セマフォが解放されるたびに、前のセマフォのカウントが表示されます。コンソール メッセージは、セマフォの使用状況を追跡します。出力を読み取りやすくするために、シミュレートされた動作間隔がスレッドごとに若干増加します。

Windows Phone OS

サポート: 8.0

この型は、スレッド セーフです。

表示:
© 2014 Microsoft