InitializeCriticalSectionEx 関数 (synchapi.h)
スピンカウントと省略可能なフラグを使用してクリティカル セクション オブジェクトを初期化します。
構文
BOOL InitializeCriticalSectionEx(
[out] LPCRITICAL_SECTION lpCriticalSection,
[in] DWORD dwSpinCount,
[in] DWORD Flags
);
パラメーター
[out] lpCriticalSection
クリティカル セクション オブジェクトへのポインター。
[in] dwSpinCount
クリティカル セクション オブジェクトのスピン カウント。 単一プロセッサ システムでは、スピン数は無視され、クリティカル セクションのスピン数は 0 (ゼロ) に設定されます。 マルチプロセッサ システムでは、クリティカル セクションが使用できない場合、呼び出し元のスレッドが dwSpinCount 回スピンしてから、クリティカル セクションに関連付けられているセマフォに対して待機操作を実行します。 スピン操作中にクリティカル セクションが解放されると、呼び出し元スレッドは待機操作を回避します。
[in] Flags
このパラメーターには、0 または次の値を指定できます。
値 | 意味 |
---|---|
CRITICAL_SECTION_NO_DEBUG_INFO | クリティカル セクションは、デバッグ情報なしで作成されます。 |
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
1 つのプロセスのスレッドは、相互排他同期にクリティカル セクション オブジェクトを使用できます。 スレッドがクリティカル セクションの所有権を取得する順序については保証されませんが、システムはすべてのスレッドに公平です。
このプロセスは、クリティカル セクション オブジェクトによって使用されるメモリを割り当てる役割を担います。これは、 CRITICAL_SECTION型の変数を宣言することによって実行できます。 クリティカル セクションを使用する前に、プロセスの一部のスレッドで オブジェクトを初期化する必要があります。 その後、 SetCriticalSectionSpinCount 関数を呼び出してスピン数を変更できます。
クリティカル セクション オブジェクトが初期化されると、プロセスのスレッドは 、EnterCriticalSection、 TryEnterCriticalSection、または LeaveCriticalSection 関数でオブジェクトを指定して、共有リソースへの相互排他アクセスを提供できます。 異なるプロセスのスレッド間で同様の同期を行う場合は、ミューテックス オブジェクトを使用します。
クリティカル セクション オブジェクトを移動またはコピーすることはできません。 また、プロセスはオブジェクトを変更する必要はありませんが、論理的に不透明として扱う必要があります。 クリティカル セクション オブジェクトを管理するには、クリティカル セクション関数のみを使用します。 クリティカル セクションの使用が完了したら、 DeleteCriticalSection 関数を呼び出します。
クリティカル セクション オブジェクトは、再初期化する前に削除する必要があります。 既に初期化されているクリティカル セクションを初期化すると、未定義の動作が発生します。
スピン数は、高レベルの競合が発生する可能性がある短い期間の重要なセクションに役立ちます。 SMP システム上のアプリケーションに 2 つまたは 3 つのスレッドが常にメモリを割り当て、ヒープから解放する最悪のシナリオを考えてみましょう。 アプリケーションは、クリティカル セクションを使用してヒープをシリアル化します。 最悪のシナリオでは、クリティカル セクションの競合は一定であり、各スレッドは WaitForSingleObject 関数に対して処理集中型の呼び出しを行います。 ただし、スピン数が正しく設定されている場合、競合が発生したときに呼び出し元のスレッドは WaitForSingleObject を すぐに呼び出しません。 代わりに、呼び出し元のスレッドは、スピン操作中に解放された場合、クリティカル セクションの所有権を取得できます。
短い期間のクリティカル セクションに対して小さなスピン数を選択することで、パフォーマンスを大幅に向上させることができます。 ヒープ マネージャーは、ヒープごとのクリティカル セクションに約 4,000 のスピンカウントを使用します。 これにより、ほぼすべての最悪のシナリオで優れたパフォーマンスとスケーラビリティが得られます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | synchapi.h (Windows 7 の Windows.h、Windows Server 2008 Windows Server 2008 R2 を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |