CSingleLock
クラス
マルチスレッド プログラムで 1 つのリソースのアクセス制御に使うアクセス コントロール機構を表します。
構文
class CSingleLock
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CSingleLock::CSingleLock |
CSingleLock オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CSingleLock::IsLocked |
オブジェクトがロックされているかどうかを判断します。 |
CSingleLock::Lock |
同期オブジェクトを待機します。 |
CSingleLock::Unlock |
同期オブジェクトを解放します。 |
解説
CSingleLock
には基底クラスはありません。
同期クラス CSemaphore
、 CMutex
、 CCriticalSection
、および CEvent
を使用するには、同期オブジェクトを待機して解放するために、 CSingleLock
または CMultiLock
オブジェクトを作成する必要があります。 CSingleLock
は、一度に 1 つのオブジェクトだけを待機する必要がある場合に使用します。 特定の時点で複数のオブジェクトを使用できる場合は、 CMultiLock
を使用します。
CSingleLock
オブジェクトを使用するには、制御されたリソースのクラスのメンバー関数内でそのコンストラクターを呼び出します。 次に、 IsLocked
メンバー関数を呼び出して、リソースが使用可能かどうかを判断します。 その場合は、メンバー関数の残りの部分に進みます。 リソースが使用できない場合は、リソースが解放されるまで指定した時間待機するか、エラーを返します。 リソースの使用が完了したら、CSingleLock
オブジェクトを再度使用する場合はUnlock
関数を呼び出すか、CSingleLock
オブジェクトを破棄できるようにします。
CSingleLock
オブジェクトには、 CSyncObject
から派生したオブジェクトが存在する必要があります。 これは通常、制御されたリソースのクラスのデータ メンバーです。 CSingleLock
オブジェクトの使用方法の詳細については、「Multithreading: How to Use the Synchronization Classes」を参照してください。
継承階層
CSingleLock
要件
ヘッダー: afxmt.h
CSingleLock::CSingleLock
CSingleLock
オブジェクトを構築します。
explicit CSingleLock(
CSyncObject* pObject,
BOOL bInitialLock = FALSE);
パラメーター
pObject
アクセスする同期オブジェクトをポイントします。 NULL
にすることはあり得ません。
bInitialLock
指定されたオブジェクトへの最初のアクセスを試みるかどうかを指定します。
解説
この関数は、通常、制御されたリソースのアクセス メンバー関数内から呼び出されます。
例
// m_CritSection is a data member (of type CCriticalSection)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_CritSection) with
// our CSingleLock object.
CSingleLock singleLock(&m_CritSection);
singleLock.Lock(); // Attempt to lock the shared resource
if (singleLock.IsLocked()) // Resource has been locked
{
//...use the shared resource...
// Now that we are finished,
// unlock the resource for others.
singleLock.Unlock();
}
CSingleLock::IsLocked
CSingleLock
オブジェクトに関連付けられているオブジェクトが非署名 (使用不可) かどうかを判断します。
BOOL IsLocked();
戻り値
オブジェクトがロックされている場合は 0 以外。それ以外の場合は 0。
例
// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_Mutex) with
// our CSingleLock object.
CSingleLock singleLock(&m_Mutex);
// Attempt to lock the shared resource
singleLock.Lock(100); // Wait 100 ms...
// Has the resource been successfully locked?
if (singleLock.IsLocked())
{
// We were able to lock the resource;
// we may now work with the data associated with the mutex...
// Now that we are finished, unlock the resource for others.
singleLock.Unlock();
}
CSingleLock::Lock
この関数を呼び出して、 CSingleLock
コンストラクターに指定された同期オブジェクトによって制御されるリソースにアクセスします。
BOOL Lock(DWORD dwTimeOut = INFINITE);
パラメーター
dwTimeOut
同期オブジェクトが使用可能になるまで待機する時間 (シグナル通知) を指定します。 INFINITE
場合、Lock
はオブジェクトが通知されるまで待機してから戻ります。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0。
解説
同期オブジェクトが通知されると、 Lock
は正常に返され、スレッドがオブジェクトを所有するようになりました。 同期オブジェクトが非署名 (使用不可) の場合、 Lock
は同期オブジェクトが、 dwTimeOut
パラメーターで指定されたミリ秒数まで通知されるまで待機します。 指定した時間内に同期オブジェクトが通知されなかった場合、 Lock
はエラーを返します。
例
// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_Mutex) with
// our CSingleLock object.
CSingleLock singleLock(&m_Mutex);
// Attempt to lock the shared resource
if (singleLock.Lock(100)) // Wait 100 ms...
{
// We were able to lock the resource;
// we may now work with the data associated with the mutex...
// Now that we are finished, unlock the resource for others.
singleLock.Unlock();
}
CSingleLock::Unlock
CSingleLock
が所有する同期オブジェクトを解放します。
BOOL Unlock();
BOOL Unlock(
LONG lCount,
LPLONG lPrevCount = NULL);
パラメーター
lCount
リリースするアクセスの数。 0 より大きくなければなりません。 指定した量によってオブジェクトのカウントが最大値を超える場合、カウントは変更されず、関数は FALSE
返します。
lPrevCount
同期オブジェクトの前の数を受け取る変数をポイントします。 NULL
場合、前のカウントは返されません。
戻り値
関数が成功した場合は 0 以外。それ以外の場合は 0。
解説
この関数は、 CSingleLock
のデストラクターによって呼び出されます。
セマフォの複数のアクセス数を解放する必要がある場合は、2 番目の形式の Unlock
を使用し、解放するアクセスの数を指定します。
例
// m_Mutex is a data member (of type CMutex)
// of an existing class that implements the resource being shared.
// Relate the synchronization object (m_Mutex) with
// our CSingleLock object.
CSingleLock singleLock(&m_Mutex);
// Attempt to lock the shared resource
if (singleLock.Lock(100)) // Wait 100 ms...
{
// We were able to lock the resource;
// we may now work with the data associated with the mutex...
// Now that we are finished, unlock the resource for others.
singleLock.Unlock();
}