CMultiLock クラス
マルチスレッド プログラムで複数のリソースのアクセス制御に使うアクセス コントロール機構を表します。
構文
class CMultiLock
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CMultiLock::CMultiLock | CMultiLock オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CMultiLock::IsLocked | 配列内の特定の同期オブジェクトがロックされているかどうかを判断します。 |
CMultiLock::Lock | 同期オブジェクトの配列を待機します。 |
CMultiLock::Unlock | 所有している同期オブジェクトを解放します。 |
解説
CMultiLock
には基底クラスはありません。
CSemaphore、CMutex、および CEvent の同期クラスを使用するには、同期オブジェクトを待機して解放する CSingleLock オブジェクトまたは CMultiLock
CSingleLock オブジェクトを作成します。 CMultiLock
特定の時点で使用できるオブジェクトが複数ある場合に使用します。 一度に 1 つのオブジェクトだけを待機する必要がある場合に使用 CSingleLock
します。
オブジェクトを CMultiLock
使用するには、まず、待機する同期オブジェクトの配列を作成します。 次に、制御された CMultiLock
リソースのクラスのメンバー関数内でオブジェクトのコンストラクターを呼び出します。 次に、Lock メンバー関数を呼び出して、リソースが使用可能 (シグナル通知) されているかどうかを判断します。 存在する場合は、メンバー関数の reメインder に進みます。 使用可能なリソースがない場合は、リソースが解放されるまで指定した時間待機するか、エラーを返します。 リソースの使用が完了したら、オブジェクトを 再度使用する場合は Unlock 関数を CMultiLock
呼び出すか、オブジェクトの CMultiLock
破棄を許可します。
CMultiLock
オブジェクトは、スレッドが応答できるオブジェクトの CEvent
数が多い場合に最も便利です。 すべてのポインターを含む配列を CEvent
作成し、呼び出します Lock
。 これにより、いずれかのイベントが通知されるまでスレッドが待機します。
オブジェクトの使用方法CMultiLock
の詳細については、「マルチスレッド: 同期クラスを使用する方法」を参照してください。
継承階層
CMultiLock
必要条件
ヘッダー: afxmt.h
CMultiLock::CMultiLock
CMultiLock
オブジェクトを構築します。
CMultiLock(
CSyncObject* ppObjects [ ],
DWORD dwCount,
BOOL bInitialLock = FALSE);
パラメーター
ppObjects
待機する同期オブジェクトへのポインターの配列。 Nll は指定できません。
dwCount
ppObjects 内の オブジェクトの数。 0 より大きくなければなりません。
bInitialLock
指定されたオブジェクトへの最初のアクセスを試みるかどうかを指定します。
解説
この関数は、待機する同期オブジェクトの配列を作成した後に呼び出されます。 これは通常、いずれかの同期オブジェクトが使用可能になるまで待機する必要があるスレッド内から呼び出されます。
CMultiLock::IsLocked
指定したオブジェクトが非署名 (使用不可) かどうかを判断します。
BOOL IsLocked(DWORD dwItem);
パラメーター
dwItem
状態が照会されているオブジェクトに対応するオブジェクトの配列内のインデックス。
戻り値
指定したオブジェクトがロックされている場合は 0 以外。それ以外の場合は 0。
CMultiLock::Lock
コンストラクターに指定された同期オブジェクトによって制御される 1 つ以上のリソースにアクセスするには、この関数を CMultiLock
呼び出します。
DWORD Lock(
DWORD dwTimeOut = INFINITE,
BOOL bWaitForAll = TRUE,
DWORD dwWakeMask = 0);
パラメーター
dwTimeOut
同期オブジェクトが使用可能になるまで待機する時間 (シグナル通知) を指定します。 INFINITE の場合は、 Lock
オブジェクトが通知されるまで待機してから戻ります。
bWaitForAll
待機しているすべてのオブジェクトが、戻る前に同時にシグナル通知を受け取る必要があるかどうかを指定します。 FAL Standard Edition の場合は、Lock
待機しているオブジェクトのいずれかが通知されたときに返されます。
dwWakeMask
待機を中止できるその他の条件を指定します。 このパラメーターで使用できるオプションの完全な一覧については、Windows SDK の MsgWaitForMultipleObjects を参照してください。
戻り値
失敗した場合 Lock
、- 1 が返されます。 成功した場合は、次のいずれかの値が返されます。
WAIT_OBJECT_0 と WAIT_OBJECT_0 + の間 (オブジェクトの数 - 1)
bWaitForAll が TRUE の場合、すべてのオブジェクトが通知されます (使用可能)。 bWaitForAll が FAL Standard Edition の場合、戻り値 - WAIT_OBJECT_0は、シグナル通知される (使用可能な) オブジェクトのオブジェクトの配列内のインデックスです。
WAIT_OBJECT_0 + (オブジェクトの数)
dwWakeMask で指定されたイベントは、スレッドの入力キューで使用できます。
WAIT_ABANDONED_0 と WAIT_ABANDONED_0 + の間 (オブジェクトの数 - 1)
bWaitForAll が TRUE の場合、すべてのオブジェクトがシグナル通知され、少なくとも 1 つのオブジェクトが破棄されたミューテックス オブジェクトになります。 bWaitForAll が FAL Standard Edition の場合、戻り値 - WAIT_ABANDONED_0は、待機を満たす破棄されたミューテックス オブジェクトのオブジェクトの配列内のインデックスです。
WAIT_TIMEOUT
dwTimeOut で指定されたタイムアウト間隔は、待機が成功せずに期限切れになりました。
解説
bWaitForAll が TRUE の場合、Lock
すべての同期オブジェクトが同時にシグナル通知されるとすぐに正常に返されます。 bWaitForAll が FAL Standard Edition の場合、 Lock
1 つ以上の同期オブジェクトが通知されるとすぐに戻ります。
すぐに戻ることができない場合Lock
は、dwTimeOut パラメーターで指定されたミリ秒数を超えて待機してから、戻ります。 dwTimeOut が INFINITE の場合、Lock
オブジェクトへのアクセスが取得されるか、dwWakeMask で指定された条件が満たされるまで戻りません。 それ以外の場合、同期オブジェクトを取得できた場合 Lock
は正常に返されます。取得できない場合は、エラーが返されます。
CMultiLock::Unlock
によって所有されている同期オブジェクトを CMultiLock
解放します。
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
パラメーター
Lcount
リリースする参照カウントの数。 0 より大きくなければなりません。 指定した量の場合、オブジェクトのカウントが最大値を超える場合、カウントは変更されず、関数は FAL Standard Edition を返します。
lPrevCount
同期オブジェクトの前の数を受け取る変数をポイントします。 NULL の場合、前のカウントは返されません。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0。
解説
この関数は、's デストラクター' によって CMultiLock
呼び出されます。
最初の形式では Unlock
、によって管理 CMultiLock
されている同期オブジェクトのロックを解除しようとします。 2 番目の形式ではUnlock
、所有CMultiLock
するオブジェクトのロックをCSemaphore
解除しようとします。 ロックされたCSemaphore
オブジェクトを所有していない場合、関数は FAL Standard Edition を返します。それ以外の場合CMultiLock
は TRUE を返します。 lCount と lpPrevCount は、CSingleLock::Unlock のパラメーターとまったく同じです。 2 番目の Unlock
形式は、マルチロックの状況にはほとんど適用されません。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示