読み取り/書き込み同期の技術サンプル
更新 : 2007 年 11 月
このサンプルでは、ReaderWriterLock スレッド同期クラスの使用例を示します。開発者は ReaderWriterLock 型の機能を使用することで、スレッドが共有リソースに対して書き込みまたは変更を行っている間には、そのリソースに対する排他アクセスを強制し、そのリソースに対して読み込みまたは照会を行っている間には、そのリソースに対する非排他アクセスを許可するコードを作成できます。
このサンプルの使用方法の詳細については、次のトピックを参照してください。
コマンド プロンプトを使用してサンプルをビルドするには
コマンド プロンプト ウィンドウを開き、サンプルの使用言語に対応するサブディレクトリに移動します。
使用するプログラミング言語に応じて、「msbuild ReaderWriterSynchronizationCS.sln」または「msbuild ReaderWriterSynchronizationVB.sln」と入力します。
Visual Studio を使用してサンプルをビルドするには
Windows エクスプローラを開き、このサンプルの使用言語に対応するサブディレクトリに移動します。
使用するプログラミング言語に応じて ReaderWriterSynchronizationCS.sln のアイコンまたは ReaderWriterSynchronizationVB.sln のアイコンをダブルクリックして、そのファイルを Visual Studio で開きます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
サンプルを実行するには
新しい実行可能ファイルが格納されているディレクトリに移動します。
コマンド ラインで「ReaderWriter.exe」と入力します。
メモ :
このサンプルでは、コンソール アプリケーションをビルドします。出力を表示するには、これをコマンド プロンプトで実行する必要があります。このサンプルを実行する場合、各ライタから [Start Writing] と [Stop Writing] とが続けて出力されることを確認してください。これは、ライタはリーダーと異なり、リソースのアクセスを排他的に保持するためです。
解説
スレッド同期および排他的アクセスの詳細については、ソース コード ファイルや build.proj ファイルのコメントを参照してください。
以下の項目に、このサンプルで使用されているクラスおよび技術について簡単に説明します。
- スレッドの同期
ReaderWriterLockSleep の呼び出しとして実装されている論理リソースを保護するために使用します。ReaderWriterLock 型を使用するスレッドは、次の 2 つの方法でロックを保持できます。まず、スレッドは読み込みロックを保持できます。これは非排他的で、別のスレッドがこのクラスの読み込みロックを取得できます。次に、スレッドは書き込みロックを要求できます。これは排他的で、現在保持されている読み取りロックおよび書き込みロックが解放されるまでは取得できません。
AutoResetEvent このサンプルのメイン スレッドは、AutoResetEvent オブジェクトが設定されるまで待機します。これが設定された場合、最後の非同期関数が処理を完了したことを示します。
Interlockedこのサンプルでは、静的な Interlocked.Increment メソッドと Interlocked.Decrement メソッドを使用して、AutoResetEvent を設定するタイミングを示すカウンタ変数に非同期にアクセスします。
スレッド処理
- ThreadPool マネージ コードを記述する場合、できるだけ QueueUserWorkItem メソッドを使用して非同期メソッド呼び出しを実装することをお勧めします。このサンプルでは、この方法を使用して、論理リソースを競合するコードを実行します。
デリゲート
- WaitCallbackThreadPool クラスが使用するタイプ セーフなコールバック メソッドを作成するために使用します。