CSemaphore クラス
更新 : 2007 年 11 月
CSemaphore クラスのオブジェクトは、"セマフォ" を表します。このオブジェクトは、1 つ以上のプロセスの限られた数のスレッドだけがリソースにアクセスできるようにする同期オブジェクトで、特定のリソースに現在アクセスしているスレッド数のカウントを管理します。
class CSemaphore : public CSyncObject
解説
セマフォは、限られた数のユーザーしかサポートできない共有リソースへのアクセスを制御するのに有用です。CSemaphore オブジェクトの現在のカウントは、アクセス可能なユーザーの数を示します。カウントが 0 になると、CSemaphore オブジェクトに制御されているリソースを使用しようとするユーザーはすべてシステム キューに挿入され、タイムアウトになるか、カウントが 0 を越えるまでユーザーは待たされます。制御対象となるリソースに同時にアクセスできる最大ユーザー数は、CSemaphore オブジェクトの構築時に指定します。
CSemaphore オブジェクトを使うには、必要となったときに CSemaphore オブジェクトを構築します。待ち合わせするセマフォの名前と、アプリケーションが最初にセマフォを所有するかどうかを指定します。その後、コンストラクタから復帰すると、セマフォにアクセスできます。制御対象になっているリソースのアクセスを終了したら CSyncObject::Unlock を呼び出します。
CSemaphore オブジェクトのもう 1 つの使い方は、制御するクラスのデータ メンバとして、CSemaphore 型の変数を追加することです。制御されるオブジェクトの構築中に、CSemaphore データ メンバのコンストラクタを呼び出して、初期アクセス数、最大アクセス数、セマフォの名前 (プロセス間にまたがって使用する場合)、および必要なセキュリティ属性を指定します。
この方法で CSemaphore オブジェクトが制御するオブジェクトにアクセスするには、まずリソースのアクセス メンバ関数に CSingleLock 型、または CMultiLock 型の変数を作成します。その後、ロック オブジェクトの Lock メンバ関数 (たとえば、CSingleLock::Lock) を呼び出します。この時点でスレッドは、リソースにアクセスできるようになるか、リソースが解放されてアクセスできるようになるまで待つか、リソースが解放されるのを待ってタイムアウトとなってリソースへのアクセスができないかのいずれかの状態になります。いずれの場合も、リソースはスレッド セーフな方法でアクセスされています。リソースを解放するには、ロック オブジェクトの Unlock メンバ関数 (たとえば、CSingleLock::Unlock) を呼び出すか、ロック オブジェクトがスコープ外になるようにします。
また、CSemaphore オブジェクトをスタンドアロンで構築し、制御されるリソースにアクセスする前に、明示的にこのオブジェクトにアクセスすることもできます。この方法では、ソース コードを読む側には読みやすくなりますが、エラーを引き起こしやすくなります。
CSemaphore オブジェクトの使い方の詳細については、「マルチスレッド : 同期クラスの使用法」を参照してください。
必要条件
ヘッダー : afxmt.h