InitializeCriticalSectionAndSpinCount

クリティカルセクション オブジェクトを初期化し、クリティカルセクションのスピン カウントを設定する。

InitializeCriticalSectionAndSpinCount lpCriticalSection, dwSpinCount

lpCriticalSection : [var] クリティカルセクション オブジェクトへのポインタ。
dwSpinCount : [int] クリティカルセクション オブジェクトのスピン カウント。シングル プロセッサ システムでは、スピン カウントは無視されクリティカルセクションのスピン カウントは 0 に設定される。マルチ プロセッサ システムでは、クリティカルセクションが使用できないとき、呼び出し側スレッドはクリティカルセクションに関連付けられたセマフォでの待機に入る前に dwSpinCount 回スピンする。スピン動作中にクリティカルセクションが空けば、呼び出し側スレッドは待機を回避する。

(プラグイン / モジュール : kernel32.dll)

解説

クリティカルセクション オブジェクトを初期化し、クリティカルセクションのスピン カウントを設定する。

[戻り値]
この関数は常に成功し 0 以外の値を返す。Windows Server 2003 および Windows XP では、関数が成功した場合は
0 以外、失敗した場合は 0 を返す。拡張エラー情報を取得するには GetLastError を呼ぶ。Windows Vista
以降では、InitializeCriticalSectionAndSpinCount 関数は低メモリ状況でも常に成功する。

[備考]
単一プロセスのスレッドは、相互排他同期にクリティカルセクション
オブジェクトを使える。スレッドがクリティカルセクションの所有権を得る順序については保証されないが、システムはすべてのスレッドに公平である。プロセスはクリティカルセクション
オブジェクトで使うメモリの確保に責任を持ち、CRITICAL_SECTION
型の変数を宣言することで確保できる。クリティカルセクションを使う前に、プロセスのいずれかのスレッドがオブジェクトを初期化しなければならない。後から
SetCriticalSectionSpinCount 関数を呼んでスピン カウントを変更できる。クリティカルセクション
オブジェクトが初期化されると、プロセスのスレッドは
EnterCriticalSection、TryEnterCriticalSection、LeaveCriticalSection
関数でオブジェクトを指定し、共有リソースへの相互排他アクセスを提供できる。異なるプロセスのスレッド間で同様の同期を行うにはミューテックス
オブジェクトを使う。クリティカルセクション
オブジェクトは移動やコピーができない。プロセスはオブジェクトを変更してはならず、論理的に不透明なものとして扱う必要がある。クリティカルセクションの管理にはクリティカルセクション関数のみを使う。クリティカルセクションの使用を終えたら
DeleteCriticalSection 関数を呼ぶ。クリティカルセクション
オブジェクトは再初期化する前に削除しなければならない。既に初期化されたクリティカルセクションを初期化すると動作は未定義となる。スピン
カウントは、競合が激しくなり得る短時間のクリティカルセクションに有用である。最悪の場合として、SMP システム上のアプリケーションが
2~3
個のスレッドで常にヒープからメモリを確保・解放しており、ヒープをクリティカルセクションでシリアライズしている状況を考える。最悪のケースではクリティカルセクションの競合が継続し、各スレッドが
WaitForSingleObject 関数の処理負荷の高い呼び出しを行う。しかしスピン
カウントを適切に設定すれば、競合が発生しても呼び出し側スレッドはすぐに WaitForSingleObject
を呼ばず、スピン中にクリティカルセクションが解放されれば所有権を取得できる。短時間のクリティカルセクションで小さいスピン
カウントを選ぶことでパフォーマンスは大きく向上できる。例えばヒープ マネージャはヒープごとのクリティカルセクションに対しておよそ 4000
のスピン カウントを使っている。この関数を使うアプリケーションをコンパイルするには _WIN32_WINNT を 0x0403
以降に定義する。詳細は Using the Windows Headers を参照のこと。

情報

プラグイン / モジュールkernel32.dll
バージョン1.0
作成日2026/04/16
著作者IronHSP / CsWin32 bridge
URLhttps://github.com/inovia/IronHSP
備考Win32 API の kernel32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_kernel32_gen2.hs