次の方法で共有


CSingleLock クラス

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

構文

class CSingleLock

メンバー

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

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

パブリック メソッド

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

解説

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

同期クラス CSemaphoreCMutexCCriticalSection、および 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();
}

関連項目

階層図
CMultiLock クラス