InitializeCriticalSectionAndSpinCount 関数 (synchapi.h)

クリティカル セクション オブジェクトを初期化し、クリティカル セクションのスピン数を設定します。 スレッドがロックされているクリティカル セクションを取得しようとすると、スレッドは スピンします。スピンカウント時間を繰り返すループに入り、ロックが解放されているかどうかを確認します。 ループが終了する前にロックが解除されない場合、スレッドはスリープ状態になり、ロックが解放されるまで待機します。

構文

BOOL InitializeCriticalSectionAndSpinCount(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount
);

パラメーター

[out] lpCriticalSection

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

[in] dwSpinCount

クリティカル セクション オブジェクトのスピン カウント。 単一プロセッサ システムでは、スピン数は無視され、クリティカル セクションのスピン数は 0 (ゼロ) に設定されます。 マルチプロセッサ システムでは、クリティカル セクションが使用できない場合、呼び出し元のスレッドは dwSpinCount 回スピンしてから、クリティカル セクションに関連付けられているセマフォに対して待機操作を実行します。 スピン操作中にクリティカル セクションが解放されると、呼び出し元スレッドは待機操作を回避します。

戻り値

この関数は常に成功し、0 以外の値を返します。

Windows Server 2003 および Windows XP: 関数が成功した場合、戻り値は 0 以外です。 関数が失敗した場合、戻り値は 0 です 0。 詳細なエラー情報を得るには、GetLastError を呼び出します。 Windows Vista 以降では、メモリ不足の状況でも InitializeCriticalSectionAndSpinCount 関数は常に成功します。

注釈

1 つのプロセスのスレッドは、相互排他同期にクリティカル セクション オブジェクトを使用できます。 スレッドがクリティカル セクションの所有権を取得する順序に関する保証はありません。 ただし、システムはすべてのスレッドに対して公平です。

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

クリティカル セクション オブジェクトが初期化されると、プロセスのスレッドは 、EnterCriticalSectionTryEnterCriticalSection、または LeaveCriticalSection 関数でオブジェクトを指定して、共有リソースへの相互排他アクセスを提供できます。 異なるプロセスのスレッド間で同様の同期を行う場合は、ミューテックス オブジェクトを使用します。

クリティカル セクション オブジェクトを移動またはコピーすることはできません。 また、プロセスはオブジェクトを変更する必要はありませんが、論理的に不透明として扱う必要があります。 クリティカル セクション オブジェクトを管理するには、クリティカル セクション関数のみを使用します。 クリティカル セクションの使用が完了したら、 DeleteCriticalSection 関数を呼び出します。

クリティカル セクション オブジェクトは、再初期化する前に削除する必要があります。 既に初期化されているクリティカル セクションを初期化すると、未定義の動作が発生します。

スピン数は、高レベルの競合が発生する可能性がある短い期間の重要なセクションに役立ちます。 SMP システム上のアプリケーションに 2 つまたは 3 つのスレッドが常にメモリを割り当て、ヒープから解放する最悪のシナリオを考えてみましょう。 アプリケーションは、クリティカル セクションを使用してヒープをシリアル化します。 最悪のシナリオでは、クリティカル セクションの競合は一定であり、各スレッドは WaitForSingleObject 関数に対して処理集中型の呼び出しを行います。 ただし、スピン数が正しく設定されている場合、競合が発生したときに呼び出し元のスレッドは WaitForSingleObject を すぐに呼び出しません。 代わりに、呼び出し元のスレッドは、スピン操作中に解放された場合、クリティカル セクションの所有権を取得できます。

短い期間のクリティカル セクションに対して小さなスピン数を選択することで、パフォーマンスを大幅に向上させることができます。 たとえば、ヒープ マネージャーは、ヒープごとのクリティカル セクションに約 4,000 のスピンカウントを使用します。

この関数を使用するアプリケーションをコンパイルするには、 _WIN32_WINNT を 以降として 0x0403 定義します。 詳細については、「 Windows ヘッダーの使用」を参照してください。

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

要件

   
サポートされている最小のクライアント 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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

同期関数

WaitForSingleObject

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