CSemaphoreクラスのオブジェクトは、"セマフォ" を表します。 セマフォは、共有リソースへのアクセスを制御し、競合状態を防ぐ同期オブジェクトです。
構文
class CSemaphore : public CSyncObject
メンバー
パブリック コンストラクター
| 名前 | 説明 |
|---|---|
CSemaphore::CSemaphore |
CSemaphore オブジェクトを構築します。 |
解説
セマフォは、限られた数のユーザーしかサポートできない共有リソースへのアクセスを制御する場合に便利です。
CSemaphore オブジェクトの現在の数は、許可されている他のユーザーの数です。 カウントが 0 に達すると、 CSemaphore オブジェクトによって制御されるリソースを使用するすべての試行がシステム キューに挿入され、タイムアウトするか、カウントが 0 を超えるまで待機します。 制御されたリソースに一度にアクセスできるユーザーの最大数は、 CSemaphore オブジェクトの構築中に指定されます。
CSemaphore オブジェクトを使用するには、必要に応じ、CSemaphore オブジェクトを構築します。 待機するセマフォの名前を指定し、アプリケーションが最初にセマフォを所有する必要があることを指定します。 その後、コンストラクターが戻ったときにセマフォにアクセスできます。 制御されたリソースへのアクセスが完了したら、 CSyncObject::Unlock を呼び出します。
CSemaphoreオブジェクトを使用する別の方法は、CSemaphore型の変数を、制御するクラスのデータ メンバーとして追加することです。 制御されたオブジェクトの構築中に、初期アクセス数、最大アクセス数、セマフォの名前 (プロセス境界を越えて使用される場合)、および必要なセキュリティ属性を指定して、 CSemaphore データ メンバーのコンストラクターを呼び出します。
この方法で CSemaphore オブジェクトによって制御されるリソースにアクセスするには、まず、リソースのアクセス メンバー関数で、 CSingleLock または型 CMultiLock のいずれかの変数を作成します。 次に、lock オブジェクトの Lock メンバー関数 (たとえば、 CSingleLock::Lock) を呼び出します。 この時点で、スレッドはリソースへのアクセス権を取得するか、リソースが解放されてアクセスを得るのを待つか、リソースが解放されてタイムアウトするのを待ち、リソースへのアクセスが失敗します。 いずれの場合も、リソースはスレッド セーフな方法でアクセスされます。 リソースを解放するには、ロック オブジェクトの Unlock メンバー関数 (たとえば、 CSingleLock::Unlock) を使用するか、ロック オブジェクトがスコープ外に落ちることを許可します。
または、 CSemaphore オブジェクトをスタンドアロンで作成し、制御されたリソースにアクセスする前に明示的にアクセスすることもできます。 このメソッドは、ソース コードを読んでいる人にはより明確ですが、エラーが発生しやすくなります。
CSemaphore オブジェクトの使用方法の詳細については、「Multithreading: How to Use the Synchronization Classes」を参照してください。
継承階層
CSemaphore
要件
ヘッダー: afxmt.h
CSemaphore::CSemaphore
名前付きオブジェクトまたは名前のない CSemaphore オブジェクトを構築します。
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
パラメーター
lInitialCount
セマフォの初期使用数。 0 以上で、 lMaxCount 以下である必要があります。
lMaxCount
セマフォの最大使用数。 0 より大きくなければなりません。
pstrName
セマフォの名前。 セマフォがプロセス境界を越えてアクセスされる場合は、指定する必要があります。
NULL場合、オブジェクトは名前が付けなくなります。 名前が既存のセマフォと一致する場合、コンストラクターは、その名前のセマフォを参照する新しい CSemaphore オブジェクトを構築します。 名前がセマフォではない既存の同期オブジェクトと一致する場合、構築は失敗します。
lpsaAttributes
セマフォ オブジェクトのセキュリティ属性。 この構造の詳細については、Windows SDK の SECURITY_ATTRIBUTES を参照してください。
解説
CSemaphore オブジェクトにアクセスまたは解放するには、CMultiLockまたはCSingleLock オブジェクトを作成し、そのLockおよび Unlock メンバー関数を呼び出します。
重要
CSemaphore オブジェクトを作成した後、GetLastErrorを使用してミューテックスがまだ存在していないことを確認します。 ミューテックスが予期せず存在していた場合は、不正なプロセスがしゃがみ込み、ミューテックスを悪意を持って使用しようとしている可能性があることを示している可能性があります。 この場合、推奨されるセキュリティ意識の高い手順は、ハンドルを閉じて、オブジェクトの作成に失敗したかのように続行することです。