CCriticalSection クラス

"クリティカル セクション" を表します。これは、一度に 1 つのスレッドがコードのリソースまたはセクションにアクセスできるようにする同期オブジェクトです。

構文

class CCriticalSection : public CSyncObject

メンバー

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

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

パブリック メソッド

名前 説明
CCriticalSection::Lock オブジェクトへのアクセスを取得するために CCriticalSection 使用します。
CCriticalSection::Unlock CCriticalSection のオブジェクトを解放します。

パブリック演算子

名前 説明
CCriticalSection::operator CRITICAL_SECTION* 内部 CRITICAL_SECTION オブジェクトへのポインターを取得します。

パブリック データ メンバー

名前 説明
CCriticalSection::m_sect CRITICAL_SECTION オブジェクト。

解説

クリティカル セクションは、データまたはその他の制御されたリソースの変更を一度に 1 つのスレッドしか許可できない場合に便利です。 たとえば、リンク リストにノードを追加するプロセスは、一度に 1 つのスレッドでのみ許可する必要があります。 オブジェクトを CCriticalSection 使用してリンク リストを制御すると、一度に 1 つのスレッドのみがリストにアクセスできます。

Note

クラスの CCriticalSection 機能は、実際の Win32 CRITICAL_SECTION オブジェクトによって提供されます。

速度が重要であり、プロセス境界を越えてリソースが使用されない場合は、ミューテックス (参照 CMutex) の代わりにクリティカル セクションが使用されます。

オブジェクトを使用 CCriticalSection する方法には、スタンドアロンとクラスへの埋め込みの 2 つの方法があります。

  • スタンドアロン メソッド スタンドアロン オブジェクトを CCriticalSection 使用するには、必要に応じオブジェクトを CCriticalSection 構築します。 コンストラクターから正常に戻ったら、オブジェクトを明示的にロックします Lock。 重要なセクションへのアクセスが完了したら、呼び出 Unlock します。 このメソッドは、ソース コードを読んでいる人にとってより明確ですが、アクセスの前後に重要なセクションをロックしてロック解除することを忘れてはならないため、エラーが発生しやすくなります。

    より好ましい方法は、クラスを使用することです CSingleLock 。 また、メソッドもUnlock用意Lockされていますが、例外が発生した場合にリソースのロックを解除することを心配する必要はありません。

  • 埋め込みメソッド -type データ メンバーをクラスに追加 CCriticalSectionし、必要に応じてデータ メンバーをロックすることで、クラスを複数のスレッドと共有することもできます。

オブジェクトの使用方法 CCriticalSection の詳細については、「 マルチスレッド: 同期クラスの使用方法」を参照してください。

継承階層

CObject

CSyncObject

CCriticalSection

必要条件

ヘッダー:afxmt.h

CCriticalSection::CCriticalSection

CCriticalSection オブジェクトを構築します。

CCriticalSection();

解説

オブジェクトにアクセスまたは解放CCriticalSectionするには、オブジェクトをCSingleLock作成し、そのオブジェクトおよびUnlockメンバー関数をLock呼び出します。 オブジェクトが CCriticalSection スタンドアロンで使用されている場合は、そのメンバー関数を Unlock 呼び出して解放します。

コンストラクターが必要なシステム メモリの割り当てに失敗すると、メモリ例外 (型 CMemoryException) が自動的にスローされます。

CCriticalSection::Lock の例を参照してください。

CCriticalSection::Lock

このメンバー関数を呼び出して、クリティカル セクション オブジェクトにアクセスします。

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

パラメーター

dwTimeoutLock は、このパラメーター値を無視します。

戻り値

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

解説

Lock はブロック呼び出しであり、クリティカル セクション オブジェクトが通知されるまで戻りません (使用可能になります)。

時間指定待機が必要な場合は、オブジェクトの代わりにオブジェクトをCCriticalSection使用CMutexできます。

Lock必要なシステム メモリの割り当てに失敗すると、メモリ例外 (型CMemoryException) が自動的にスローされます。

この例では、共有CCriticalSectionオブジェクトを使用して共有リソース (静的_strSharedオブジェクト) へのアクセスを制御することで、入れ子になったクリティカル セクションアプローチを示します。 この関数は SomeMethod 、安全な方法で共有リソースを更新する方法を示します。

//Definition of critical section class
class CMyCritSectClass
{
   static CString _strShared; //shared resource
   static CCriticalSection _critSect;

public:
   CMyCritSectClass(void) {}
   ~CMyCritSectClass(void) {}
   void SomeMethod(void); //locks, modifies, and unlocks shared resource
};

//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()
{
   _critSect.Lock();
   if (_strShared == "")
      _strShared = "<text>";
   _critSect.Unlock();
}

CCriticalSection::m_sect

すべての CCriticalSection メソッドによって使用されるクリティカル セクション オブジェクトが含まれます。

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

オブジェクトを CRITICAL_SECTION 取得します。

operator CRITICAL_SECTION*();

解説

この関数を呼び出して、内部 CRITICAL_SECTION オブジェクトへのポインターを取得します。

CCriticalSection::Unlock

別のスレッドで CCriticalSection 使用するオブジェクトを解放します。

BOOL Unlock();

戻り値

オブジェクトが CCriticalSection スレッドによって所有され、リリースが成功した場合は 0 以外、それ以外の場合は 0。

解説

スタンドアロンで CCriticalSection 使用されている場合は、 Unlock クリティカル セクションによって制御されるリソースの使用が完了した直後に呼び出す必要があります。 オブジェクトが CSingleLock 使用されている場合は、 CCriticalSection::Unlock ロック オブジェクトの Unlock メンバー関数によって呼び出されます。

CCriticalSection::Lock の例を参照してください。

関連項目

CSyncObject クラス
階層図
CMutex クラス