待機による同期化の技術サンプル
更新 : 2007 年 11 月
このサンプルでは、WaitHandle クラスを使用してスレッド同期を行う方法の例を示します。WaitHandle の派生型である Mutex は、コードの保護されたブロックに同時にアクセスできないようにするために使用されます。
このサンプルの使用方法の詳細については、次のトピックを参照してください。
コマンド プロンプトを使用してサンプルをビルドするには
コマンド プロンプト ウィンドウを開き、サンプルの使用言語に対応するサブディレクトリに移動します。
使用するプログラミング言語に応じて、コマンド ラインで「msbuild WaitSynchronizationCS.sln」または「msbuild WaitSynchronizationVB.sln」と入力します。
Visual Studio を使用してサンプルをビルドするには
Windows エクスプローラを開き、このサンプルの使用言語に対応するサブディレクトリに移動します。
使用するプログラミング言語に応じて、WaitSynchronizationCS.sln のアイコンまたは WaitSynchronizationVB.sln のアイコンをダブルクリックして、そのファイルを Visual Studio で開きます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
サンプルを実行するには
新しい実行可能ファイルが格納されているディレクトリに移動します。
コマンド ラインで「Mutex.exe」と入力します。
メモ : このサンプルでは、コンソール アプリケーションをビルドします。出力を表示するには、これをコンソール ウィンドウで実行する必要があります。
解説
このサンプルでは、5 つの非同期メソッド呼び出しをキューに配置します。次に各メソッドは、リソースの所有の待機、コンソールへの書き込み、スリープ、コンソールへの 2 度目の書き込みの順に実行します。
以下の項目に、このサンプルで使用されているクラスおよび技術について簡単に説明します。
スレッドの同期
Mutex スレッド同期の相互排他処理を実現します。
AutoResetEvent このサンプルのメイン スレッドは、AutoResetEvent が設定されるまで待機します。これが設定された場合、最後の非同期関数の処理が完了したことを示します。
WaitHandleWaitHandle クラスは、クラス Mutex および AutoResetEvent などの派生元である基本クラスです。この型はメソッドに対し、さまざまな派生型が "シグナル状態" になるまで "待機" する処理を実装します。
Interlocked このサンプルでは、静的な Decrement メソッドを使用して、AutoResetEvent を設定するタイミングを示すカウンタ変数に非同期アクセスします。
スレッド処理
- ThreadPool マネージ コードを記述する場合、できるだけ QueueUserWorkItem メソッドを使用して非同期メソッド呼び出しを実装することをお勧めします。このサンプルでは、この方法を使用して、論理リソースを競合するコードを実行します。
デリゲート
- WaitCallbackThreadPool クラスが使用するタイプ セーフなコールバック メソッドを作成するために使用します。
スレッドおよび同期の詳細については、ソース コード ファイルや build.proj ファイルのコメントを参照してください。