EnterCriticalSection 関数 (synchapi.h)

指定したクリティカル セクション オブジェクトの所有権を待機します。 この関数は、呼び出し元のスレッドに所有権が付与されたときに返されます。

構文

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

パラメーター

[in, out] lpCriticalSection

クリティカル セクション オブジェクトへのポインター。

戻り値

この関数は値を返しません。

この関数 は、クリティカル セクションの待機操作がタイムアウトした場合に、 EXCEPTION_POSSIBLE_DEADLOCK (STATUS_POSSIBLE_DEADLOCK とも呼ばれます) を発生させることができます。タイムアウト間隔は、次のレジストリ値によって指定されます: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout。 デッドロック例外の可能性を処理しないでください。代わりに、アプリケーションをデバッグします。

注釈

1 つのプロセスのスレッドは、相互排他同期にクリティカル セクション オブジェクトを使用できます。 このプロセスは、クリティカル セクション オブジェクトによって使用されるメモリを割り当てる役割を担います。これは、 CRITICAL_SECTION型の変数を宣言することによって実行できます。 クリティカル セクションを使用する前に、プロセスの一部のスレッドで InitializeCriticalSection または InitializeCriticalSectionAndSpinCount を呼び出してオブジェクトを初期化する必要があります。

共有リソースへの相互排他アクセスを有効にするには、各スレッドが EnterCriticalSection または TryEnterCriticalSection 関数を呼び出してクリティカル セクションの所有権を要求してから、保護されたリソースにアクセスするコードのセクションを実行します。 違いは、 TryEnterCriticalSection はクリティカル セクションの所有権を取得したかどうかに関係なく、直ちに戻り、 EnterCriticalSection はスレッドがクリティカル セクションの所有権を取得できるようになるまでブロックすることです。 保護されたコードの実行が完了すると、スレッドは LeaveCriticalSection 関数を使用して所有権を放棄し、別のスレッドが所有者になり、保護されたリソースにアクセスできるようにします。 待機中のスレッドがクリティカル セクションの所有権を取得する順序に関する保証はありません。

スレッドがクリティカル セクションの所有権を持った後、実行をブロックすることなく 、EnterCriticalSection または TryEnterCriticalSection に対して追加の呼び出しを行うことができます。 これにより、既に所有している重要なセクションを待機している間にスレッド自体がデッドロックするのを防ぐことができます。 スレッドは、 EnterCriticalSectionTryEnterCriticalSection が成功するたびにクリティカル セクションに入ります。 スレッドは、クリティカル セクションに入るたびに LeaveCriticalSection を 1 回呼び出す必要があります。

プロセスのすべてのスレッドは 、DeleteCriticalSection 関数を使用して、クリティカル セクション オブジェクトが初期化されたときに割り当てられたシステム リソースを解放できます。 この関数が呼び出されると、クリティカル セクション オブジェクトを同期に使用できなくなります。

クリティカル セクションの所有権がある間にスレッドが終了した場合、クリティカル セクションの状態は未定義です。

クリティカル セクションがまだ所有されている間に削除された場合、削除されたクリティカル セクションの所有権を待機しているスレッドの状態は未定義です。

プロセスが終了している間に、 EnterCriticalSection の呼び出しがブロックされると、代わりにプロセスが直ちに終了します。 これにより、グローバルデストラクターが呼び出されない可能性があります。

EnterCriticalSection を使用する例については、「クリティカル セクション オブジェクトの使用」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリ | UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー synchapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

クリティカル セクション オブジェクト

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

同期関数

TryEnterCriticalSection

VBS エンクレーブで使用できる Vertdll API