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
の詳細については、「 マルチスレッド: 同期クラスの使用方法」を参照してください。
継承階層
CCriticalSection
必要条件
ヘッダー:afxmt.h
CCriticalSection::CCriticalSection
CCriticalSection
オブジェクトを構築します。
CCriticalSection();
解説
オブジェクトにアクセスまたは解放CCriticalSection
するには、オブジェクトをCSingleLock
作成し、そのオブジェクトおよびUnlock
メンバー関数をLock
呼び出します。 オブジェクトが 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
の例を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示