SetCriticalSectionSpinCount 関数 (synchapi.h)

指定したクリティカル セクションのスピン数を設定します。 スピンとは、スレッドがロックされているクリティカル セクションを取得しようとしたときに、スレッドがループに入り、ロックが解放されているかどうかを確認し、ロックが解放されていない場合はスレッドがスリープ状態に移行することを意味します。

構文

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

パラメーター

[in, out] lpCriticalSection

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

[in] dwSpinCount

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

戻り値

この関数は、クリティカル セクションの前のスピンカウントを返します。

注釈

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

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

短い期間のクリティカル セクションに対して小さなスピン数を選択することで、パフォーマンスを大幅に向上させることができます。 ヒープ マネージャーは、ヒープごとのクリティカル セクションに約 4000 のスピンカウントを使用します。 これにより、ほとんどすべての最悪のシナリオで優れたパフォーマンスとスケーラビリティが得られます。

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

要件

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

関連項目

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

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

WaitForSingleObject

同期関数

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