Monitorによる同期化の技術サンプル
更新 : 2007 年 11 月
このサンプルでは、Monitor クラスを使用してスレッド同期を行う方法の例を示します。Monitor 型の静的関数は、コードの保護されたブロックに同時にアクセスできないようにするために使用します。
スレッドの同期と Monitor クラスの詳細については、ソース コード ファイルと build.proj ファイルのコメントを参照してください。
このサンプルの使用方法の詳細については、次のトピックを参照してください。
コマンド プロンプトを使用してサンプルをビルドするには
コマンド プロンプト ウィンドウを開き、サンプルの使用言語に対応するサブディレクトリに移動します。
使用するプログラミング言語に応じて、コマンド ラインで「msbuild MonitorSynchronizationCS.sln」または「msbuild MonitorSynchronizationVB.sln」と入力します。
Visual Studio を使用してサンプルをビルドするには
Windows エクスプローラを開き、このサンプルの使用言語に対応するサブディレクトリに移動します。
使用するプログラミング言語に応じてファイル MonitorSynchronizationCS.sln のアイコンまたは MonitorSynchronizationVB.sln のアイコンをダブルクリックして、そのファイルを Visual Studio で開きます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
サンプルを実行するには
コマンド プロンプトを使用して、新しい実行可能ファイルが格納されているディレクトリに移動します。
コマンド ラインで「Monitor.exe」と入力します。
メモ : |
---|
このサンプルでは、コンソール アプリケーションをビルドします。出力を表示するには、これをコマンド プロンプトで実行する必要があります。このサンプルを実行する場合、各ライタからの "Start Writing" と "Stop Writing" とが続けて出力され、ID が異なるスレッドによる重複がないことを確認してください。これは、スレッドがリソースのアクセスを排他的に保持するためです。 |
解説
以下の項目に、このサンプルで使用されているクラスおよび技術について簡単に説明します。
スレッドの同期
Monitor コードの保護されたブロックへの出入りに使用する静的関数が用意されています。Monitor 型のインスタンスをインスタンス化することはできません。代わりに、この型の静的メソッドに、同期の単一ノードとして使用する任意のオブジェクト派生型への参照を渡すことができます。
メモ : Visual Basic と C# のどちらの実装にも、Monitor 型の静的関数を使用するための専用キーワードが用意されています。C# では lock キーワードを、Visual Basic では SyncLock キーワードを、それぞれ使用します。
AutoResetEvent このサンプルのメイン スレッドは AutoResetEvent オブジェクトが設定されるまで待機します。これが設定された場合、最後の非同期関数が処理を完了したことを示します。
Interlocked このサンプルでは、静的な Decrement メソッドを使用して、AutoResetEvent を設定するタイミングを示すカウンタ変数に非同期アクセスします。
スレッド処理
- ThreadPool マネージ コードを記述する場合、できるだけ QueueUserWorkItem メソッドを使用して非同期メソッド呼び出しを実装することをお勧めします。このサンプルでは、この方法を使用して、論理リソースを競合するコードを実行します。
デリゲート
- WaitCallbackThreadPool が使用するタイプ セーフなコールバック メソッドを作成するために使用します。