CMultiLock クラス
マルチスレッド プログラムで複数のリソースのアクセス制御に使うアクセス コントロール機構を表します。
構文
class CMultiLock
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CMultiLock::CMultiLock | CMultiLock オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CMultiLock::IsLocked | 配列内の特定の同期オブジェクトがロックされているかどうかを判断します。 |
CMultiLock::Lock | 同期オブジェクトの配列を待機します。 |
CMultiLock::Unlock | 所有している同期オブジェクトを解放します。 |
解説
CMultiLock
には基底クラスはありません。
CSemaphore CSemaphore、 CMutex、および 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 を返します。 lCount と lpPrevCount は、 CSingleLock::Unlock のパラメーターとまったく同じです。 Unlock
の 2 番目の形式は、マルチロックの状況にはほとんど適用されません。