次の方法で共有


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 クラスを使用することです。 また、 LockUnlock メソッドもありますが、例外が発生した場合にリソースのロックを解除する必要はありません。

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

CCriticalSection オブジェクトの使用方法の詳細については、「Multithreading: How to Use the Synchronization Classes」を参照してください。

継承階層

CObject

CSyncObject

CCriticalSection

要件

ヘッダー: afxmt.h

CCriticalSection::CCriticalSection

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

CCriticalSection();

解説

CCriticalSection オブジェクトにアクセスまたは解放するには、CSingleLock オブジェクトを作成し、そのLockUnlockメンバー関数を呼び出します。 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 クラス