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
Header: afxmt.h
名前付きオブジェクトまたは名前のない 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
を使用してミューテックスがまだ存在していないことを確認します。 ミューテックスが予期せず存在していた場合は、不正なプロセスがしゃがみ込み、ミューテックスを悪意を持って使用しようとしている可能性があることを示している可能性があります。 この場合、推奨されるセキュリティ意識の高い手順は、ハンドルを閉じて、オブジェクトの作成に失敗したかのように続行することです。