CMultiLock クラス

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

構文

class CMultiLock

メンバー

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

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

パブリック メソッド

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

解説

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

CSemaphore CSemaphoreCMutex、および CEvent を使用するには、同期オブジェクトを待機して解放する CMultiLock または CSingleLock オブジェクトを作成します。 特定の時点で複数のオブジェクトを使用できる場合は、 CMultiLock を使用します。 CSingleLockは、一度に 1 つのオブジェクトだけを待機する必要がある場合に使用します。

CMultiLock オブジェクトを使用するには、まず、待機する同期オブジェクトの配列を作成します。 次に、制御されたリソースのクラスのメンバー関数内で、 CMultiLock オブジェクトのコンストラクターを呼び出します。 次に、 Lock メンバー関数を呼び出して、リソースが使用可能かどうかを判断します (シグナル通知)。 ある場合は、メンバー関数の残りの部分に進みます。 使用可能なリソースがない場合は、リソースが解放されるまで指定した時間待機するか、エラーを返します。 リソースの使用が完了したら、CMultiLock オブジェクトを再度使用する場合は Unlock 関数を呼び出すか、CMultiLock オブジェクトの破棄を許可します。

CMultiLock オブジェクトは、スレッドが応答できる多数の CEvent オブジェクトがある場合に最も便利です。 すべての CEvent ポインターを含む配列を作成し、 Lockを呼び出します。 これにより、いずれかのイベントが通知されるまでスレッドが待機します。

CMultiLock オブジェクトの使用方法の詳細については、「Multithreading: How to Use the Synchronization Classes」を参照してください。

継承階層

CMultiLock

要件

Header: 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

この関数を呼び出して、 CMultiLock コンストラクターに指定された同期オブジェクトによって制御される 1 つ以上のリソースにアクセスします。

DWORD Lock(
    DWORD dwTimeOut = INFINITE,
    BOOL bWaitForAll = TRUE,
    DWORD dwWakeMask = 0);

パラメーター

dwTimeOut
同期オブジェクトが使用可能になるまで待機する時間 (シグナル通知) を指定します。 INFINITE の場合、 Lock はオブジェクトが通知されるまで待機してから戻ります。

bWaitForAll
待機しているすべてのオブジェクトが、戻る前に同時にシグナル通知を受け取る必要があるかどうかを指定します。 FALSE の場合、待機しているオブジェクトのいずれかが通知されると、 Lock が返されます。

dwWakeMask
待機を中止できるその他の条件を指定します。 このパラメーターで使用できるオプションの完全な一覧については、Windows SDK の MsgWaitForMultipleObjects を参照してください。

戻り値

Lock失敗した場合は、- 1 を返します。 成功した場合は、次のいずれかの値が返されます。

  • WAIT_OBJECT_0 と WAIT_OBJECT_0 + の間 (オブジェクトの数 - 1)

    bWaitForAll が TRUE の場合、すべてのオブジェクトがシグナル通知されます (使用可能)。 bWaitForAll が FALSE の場合、戻り値 - WAIT_OBJECT_0はシグナル通知される (使用可能) オブジェクトのオブジェクトの配列内のインデックスです。

  • WAIT_OBJECT_0 + (オブジェクトの数)

    dwWakeMask で指定されたイベントは、スレッドの入力キューで使用できます。

  • WAIT_ABANDONED_0 と WAIT_ABANDONED_0 + の間 (オブジェクトの数 - 1)

    bWaitForAll が TRUE の場合、すべてのオブジェクトがシグナル通知され、少なくとも 1 つのオブジェクトが破棄されたミューテックス オブジェクトになります。 bWaitForAll が FALSE の場合、戻り値 - WAIT_ABANDONED_0は、待機を満たす破棄されたミューテックス オブジェクトのオブジェクトの配列内のインデックスです。

  • WAIT_TIMEOUT

    dwTimeOut で指定されたタイムアウト間隔待機が成功せずに期限切れになりました。

解説

bWaitForAll が TRUE の場合、すべての同期オブジェクトが同時に通知されるとすぐに、Lockは正常に返されます。 bWaitForAll が FALSE の場合、1 つ以上の同期オブジェクトが通知されるとすぐに、Lockが返されます。

Lockがすぐに戻ることができない場合は、dwTimeOut パラメーターで指定されたミリ秒数を超えて待機してから、戻ります。 dwTimeOut が INFINITE の場合、オブジェクトへのアクセスが取得されるか、dwWakeMask で指定された条件が満たされるまで、Lockは戻りません。 それ以外の場合、 Lock が同期オブジェクトを取得できた場合は正常に返されます。取得できない場合は失敗を返します。

CMultiLock::Unlock

CMultiLockが所有する同期オブジェクトを解放します。

BOOL Unlock();

BOOL Unlock(
    LONG lCount,
    LPLONG lPrevCount = NULL);

パラメーター

lCount
リリースする参照カウントの数。 0 より大きくなければなりません。 指定した量の場合、オブジェクトのカウントが最大値を超える場合、カウントは変更されず、関数は FALSE を返します。

lPrevCount
同期オブジェクトの前の数を受け取る変数をポイントします。 NULL の場合、前のカウントは返されません。

戻り値

関数が成功した場合は 0 以外。それ以外の場合は 0。

解説

この関数は、 CMultiLockのデストラクターによって呼び出されます。

Unlockの最初の形式では、CMultiLockによって管理される同期オブジェクトのロックが解除されます。 2 番目の形式のUnlockは、CMultiLockが所有するCSemaphore オブジェクトのロックを解除しようとします。 CMultiLockロックされたCSemaphore オブジェクトを所有していない場合、関数は FALSE を返します。それ以外の場合は TRUE を返します。 lCountlpPrevCount は、 CSingleLock::Unlock のパラメーターとまったく同じです。 Unlockの 2 番目の形式は、マルチロックの状況にはほとんど適用されません。

関連項目

階層図