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
の詳細については、「マルチスレッド: 同期クラスを使用する方法」を参照してください。
継承階層
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 を使用して、ミューテックスがまだ存在していないことを確認します。 ミューテックスが予期せず存在していた場合は、不正なプロセスがしゃがみ込み、ミューテックスを悪意を持って使用しようとしている可能性があることを示している可能性があります。 この場合、推奨されるセキュリティ意識の高い手順は、ハンドルを閉じて、オブジェクトの作成に失敗したかのように続行することです。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示