CMultiLock クラス

マルチスレッド プログラムで複数のリソースのアクセス制御に使うアクセス コントロール機構を表します。

構文

class CMultiLock

メンバー

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

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

パブリック メソッド

名前 説明
CMultiLock::IsLocked 配列内の特定の同期オブジェクトがロックされているかどうかを判断します。
CMultiLock::Lock 同期オブジェクトの配列を待機します。
CMultiLock::Unlock 所有している同期オブジェクトを解放します。

解説

CMultiLock には基底クラスはありません。

CSemaphore、CMutexおよび CEvent の同期クラスを使用するには、同期オブジェクトを待機して解放する CSingleLock オブジェクトまたは CMultiLockCSingleLock オブジェクトを作成します。 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 を返します。 lCountlpPrevCount は、CSingleLock::Unlockパラメーターとまったく同じです。 2 番目の Unlock 形式は、マルチロックの状況にはほとんど適用されません。

関連項目

階層図