CSemaphore クラス
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