CSemaphore クラス

クラス CSemaphore のオブジェクトは、"セマフォ" を表します。これは、1 つ以上のプロセス内の限られた数のスレッドが、指定されたリソースに現在アクセスしているスレッドの数を保持するアクセスを許可する同期オブジェクトです。

構文

class CSemaphore : public CSyncObject

メンバー

パブリック コンストラクター

名前 説明
CSemaphore::CSemaphore CSemaphore オブジェクトを構築します。

解説

セマフォは、限られた数のユーザーしかサポートできない共有リソースへのアクセスを制御する場合に便利です。 オブジェクトの現在の CSemaphore 数は、許可される追加ユーザーの数です。 カウントが 0 に達すると、オブジェクトによって CSemaphore 制御されるリソースを使用するすべての試行がシステム キューに挿入され、タイムアウトするか、カウントが 0 を超えるまで待機します。 制御されたリソースに一度にアクセスできるユーザーの最大数は、オブジェクトの構築中に CSemaphore 指定されます。

オブジェクトを CSemaphore 使用するには、必要に応じオブジェクトを CSemaphore 構築します。 待機するセマフォの名前を指定し、アプリケーションが最初にセマフォを所有する必要があることを指定します。 その後、コンストラクターが戻ったときにセマフォにアクセスできます。 制御されたリソースへのアクセスが完了したら、CSyncObject::Unlock を呼び出します。

オブジェクトを使用 CSemaphore する別の方法は、制御するクラスにデータ メンバーとして型 CSemaphore の変数を追加することです。 制御されたオブジェクトの構築中に、初期アクセス数、最大アクセス数、セマフォの CSemaphore 名前 (プロセスの境界を越えて使用される場合)、および必要なセキュリティ属性を指定して、データ メンバーのコンストラクターを呼び出します。

この方法でオブジェクトによって制御されるCSemaphoreリソースにアクセスするには、まず、リソースのアクセス メンバー関数に CSingleLockまたは CMultiLockの変数を作成します。 次に、ロック オブジェクトのLockメンバー関数 (CSingleLock::Lock など) を呼び出します。 この時点で、スレッドはリソースへのアクセス権を取得するか、リソースが解放されてアクセスを得るのを待つか、リソースが解放されてタイムアウトするのを待ち、リソースへのアクセスが失敗します。 いずれの場合も、リソースにはスレッド セーフな方法でアクセスされています。 リソースを解放するには、ロック オブジェクトのUnlockメンバー関数 (CSingleLock::Unlock など) を使用するか、ロック オブジェクトがスコープから外れるようにします。

または、オブジェクトをスタンドアロンで CSemaphore 作成し、制御されたリソースへのアクセスを試みる前に明示的にアクセスすることもできます。 このメソッドは、ソース コードを読んでいる人にはより明確ですが、エラーが発生しやすくなります。

オブジェクトの使用方法CSemaphoreの詳細については、「マルチスレッド: 同期クラスを使用する方法」を参照してください

継承階層

CObject

CSyncObject

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 のStandard EditionCURITY_ATTRIBUTESを参照してください

解説

オブジェクトにアクセスまたは解放CSemaphoreするには、CMultiLock または CSingleLock オブジェクトを作成し、その Lock および Unlock メンバー関数を呼び出します。

重要

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

関連項目

CSyncObject クラス
階層図