スレッド スタック サイズ

新しいスレッドまたはファイバーはそれぞれ、予約済みメモリと最初にコミットされたメモリの両方で構成される独自のスタック領域を受け取ります。 予約済みメモリ サイズは、仮想メモリ内のスタック割り当ての合計を表します。 そのため、予約済みのサイズは仮想アドレス範囲に制限されます。 最初にコミットされたページは、参照されるまで物理メモリを利用しません。ただし、システムの合計コミット制限 (ページ ファイルのサイズと物理メモリのサイズ) からページが削除されます。 システムは、必要に応じて、予約済みスタック メモリから追加のページをコミットします。スタックが予約済みサイズから 1 ページを引いた値 (スタック オーバーフローを防ぐためにガード ページとして使用されます) に達するか、システムのメモリが不足しているために操作が失敗します。

可能な限り小さいスタック サイズを選択し、スレッドまたはファイバーを確実に実行するために必要なスタックをコミットすることをお勧めします。 スタック用に予約されているすべてのページは、他の目的には使用できません。

スタックは、スレッドが終了すると解放されます。 スレッドが別のスレッドによって終了された場合、解放されません。

予約済みおよび最初にコミットされたスタック メモリの既定のサイズは、実行可能ファイル ヘッダーで指定されます。 要求されたバイト数を予約またはコミットするのに十分なメモリがない場合、スレッドまたはファイバーの作成は失敗します。 リンカーで使用される既定のスタック予約サイズは 1 MB です。 すべてのスレッドとファイバーに対して別の既定のスタック予約サイズを指定するには、モジュール定義 (.def) ファイルの STACKSIZE ステートメントを使用します。 オペレーティング システムは、指定されたサイズをシステムの割り当て粒度の最も近い倍数 (通常は 64 KB) に切り上げます。 現在のシステムの割り当て粒度を取得するには、 GetSystemInfo 関数を使用します。

最初にコミットされたスタック領域を変更するには、CreateThread、CreateRemoteThread、または CreateFiber 関数の dwStackSize パラメーターを使用します。 この値は、最も近いページに切り上げられます。 通常、予約サイズは、実行可能ヘッダーで指定された既定の予約サイズです。 ただし、 dwStackSize で指定された最初にコミットされたサイズが既定の予約サイズ以上の場合、予約サイズはこの新しいコミット サイズで、最も近い 1 MB の倍数に切り上げられます。

予約済みスタック サイズを変更するには、CreateThread または CreateRemoteThreaddwCreationFlags パラメーターをSTACK_SIZE_PARAM_IS_A_RESERVATIONに設定し、dwStackSize パラメーターを使用します。 この場合、最初にコミットされたサイズは、実行可能ヘッダーで指定された既定のサイズです。 ファイバーの場合は、CreateFiberExdwStackReserveSize パラメーターを使用します。 コミットされたサイズは、 dwStackCommitSize パラメーターで指定されます。

SetThreadStackGuarantee 関数は、呼び出し元のスレッドまたはファイバーに関連付けられているスタックの最小サイズを設定します。このサイズは、スタック オーバーフロー例外の発生時に使用できます。