CSingleLock クラス

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

構文

class CSingleLock

メンバー

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

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

パブリック メソッド

名前 説明
CSingleLock::IsLocked オブジェクトがロックされているかどうかを判断します。
CSingleLock::Lock 同期オブジェクトを待機します。
CSingleLock::Unlock 同期オブジェクトを解放します。

解説

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

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

オブジェクトを CSingleLock 使用するには、制御されたリソースのクラスのメンバー関数内でそのコンストラクターを呼び出します。 次に、メンバー関数を IsLocked 呼び出して、リソースが使用可能かどうかを判断します。 その場合は、メンバー関数の reメインder に進みます。 リソースが使用できない場合は、リソースが解放されるまで指定した時間待機するか、エラーを返します。 リソースの使用が完了したら、オブジェクトを Unlock 再度使用する場合は関数を CSingleLock 呼び出すか、オブジェクトの CSingleLock 破棄を許可します。

CSingleLock オブジェクトには、から CSyncObject派生したオブジェクトが存在する必要があります。 これは通常、制御されたリソースのクラスのデータ メンバーです。 オブジェクトの使用方法CSingleLockの詳細については、「マルチスレッド: 同期クラスを使用する方法」を参照してください

継承階層

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
同期オブジェクトが使用可能になるまで待機する時間 (シグナル通知) を指定します。 if 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。

解説

この関数は、's デストラクター' によって 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();
}

関連項目

階層図
CMultiLock クラス