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
クラスを使用することです。 また、Lock
とUnlock
メソッドもありますが、例外が発生した場合にリソースのロックを解除する必要はありません。埋め込みメソッド
CCriticalSection
型のデータ メンバーをクラスに追加し、必要に応じてデータ メンバーをロックすることで、クラスを複数のスレッドと共有することもできます。
CCriticalSection
オブジェクトの使用方法の詳細については、「Multithreading: How to Use the Synchronization Classes」を参照してください。
継承階層
CCriticalSection
要件
ヘッダー: afxmt.h
CCriticalSection::CCriticalSection
CCriticalSection
オブジェクトを構築します。
CCriticalSection();
解説
CCriticalSection
オブジェクトにアクセスまたは解放するには、CSingleLock
オブジェクトを作成し、そのLock
とUnlock
メンバー関数を呼び出します。 CCriticalSection
オブジェクトがスタンドアロンで使用されている場合は、そのUnlock
メンバー関数を呼び出して解放します。
コンストラクターが必要なシステム メモリの割り当てに失敗すると、メモリ例外 ( CMemoryException
型) が自動的にスローされます。
例
CCriticalSection::Lock の例を参照してください。
CCriticalSection::Lock
このメンバー関数を呼び出して、クリティカル セクション オブジェクトにアクセスします。
BOOL Lock();
BOOL Lock(DWORD dwTimeout);
パラメーター
dwTimeout
Lock
は、このパラメーター値を無視します。
戻り値
関数が成功した場合は 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
の例を参照してください。