2015-11-14 8 views
5

私はソースコードでC++とWindows.hを使用しています。私はMSDNでCreateThread APIを読んでいますが、スタックサイズを指定する本質はまだ分かりません。デフォルトでは1 MBです。 32バイトを指定するとどうなりますか?スレッド内のスタックサイズはC++で何に定義されますか?

スレッドのスタックサイズは何と定義されていますか?

徹底した説明をしていただければ幸いです。ありがとう。

+3

リンク先のページは次のとおりです。*詳細については、[スレッドスタックサイズ](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686774(v=vs.85) .aspx)*。自分がリンクしているドキュメントをお読みください。 – bolov

+0

おそらく32バイトのスタックを要求することはできません。最小サイズは1つのメモリページ(通常は4 KB)でなければなりません。 –

+1

あなたの質問とは無関係ですが、C++を使用する場合は[CreateThread](https:// msdn)の代わりに[_beginthreadex](https://msdn.microsoft.com/en-us/library/kdzttdcb.aspx)を呼び出す必要があります。 microsoft.com/en-us/library/windows/desktop/ms682453.aspx)。これはドキュメントに明示されています。 – IInspectable

答えて

14

スタックは、ローカル変数の格納、関数呼び出しのパラメータの渡し、戻り値の格納に使用されます。スレッドのスタックは、スレッドの作成時に決定される固定サイズを持ちます。それもあなたが参照している価値です。

スタックサイズは、連続したアドレス空間を占有する必要があるため、スレッドの作成時に決定されます。つまり、スレッドのスタックのアドレス空間全体が、スレッドの作成時点で予​​約されていなければなりません。

スタックが小さすぎるとオーバーフローする可能性があります。これは、スタックオーバーフローとして知られているエラー状態です。このウェブサイトから名前が付けられました。関数を呼び出すと、次のいずれかまたはすべてが発生します。

  • パラメータがスタックにプッシュされます。
  • リターンアドレスがスタックにプッシュされます。
  • 関数のローカル変数用のスペースを含むスタックフレームが作成されます。

このすべてがスタックからのスペースを消費します。関数が別の関数を呼び出すと、より多くのスタック領域が消費されます。コールスタックが深くなるにつれて、より多くのスタックスペースが必要になります。

スタックサイズを小さくし過ぎると、スタックが使い果たされてオーバーフローする可能性があります。これは回復できない終端条件です。確かに32バイト(4096バイトの1ページに切り上げられた)は、ほとんどのスレッドでは小さすぎます。

多くのスレッドを持つプログラムがあり、そのスレッドが1MBのスタックサイズを予約する必要がないことがわかっている場合、小さなスタックサイズを使用する利点があります。そうすることで、使用可能なプロセスアドレス空間が使い果たされるのを防ぐことができます。

一方、大量のスタック領域を消費するディープコールスタックを持つ1つのスレッドを持つプログラムがあるとします。このシナリオでは、デフォルトの1MB以上を予約することができます。

しかし、そうしなければならない強い理由がない限り、デフォルトのスタックサイズに固執することが最も適切です。

+0

たぶんそれは私ですが、2番目の段落では、プロセスアドレス空間全体を予約しなければならないと言われているようです。また、スレッドスタックサイズの値を低く設定したり、より高い値を設定したりすることができる状況の例を追加することも面白いかもしれません。 –

+1

@マッテオありがとう、 –

+0

Upvoted、私はそれがOKの答えだと思う。 2番目の段落はOKです。将来の実装で必ずしも成立しない追加情報は、明らかにするよりも混乱するかもしれません。 –

0

しかし、32バイトを指定するとどうなりますか?

私はWindowsのマニュアルを読んでいませんが、Windowsがこれを許可すると(32バイトしか指定できない)、スタックオーバーフローが発生する可能性が高くなります。彼らの文書によると、値は任意の場合のページサイズに切り上げられます。したがって、実際にはスタックサイズは少なくともページのサイズになります。作成されたスレッドは、(自動変数の割り当て、関数アドレスの格納などに)使用するのに十分な「スタック領域」が存在することを前提とし、必要に応じて領域を割り当てます。十分なスタック領域がない場合、スタックアロケータは無効なメモリを使用し、他の場所で使用されているメモリをオーバーライドする可能性があります。

スレッドのスタックサイズは何と定義されていますか?

このスレッドのスタックが使用するメモリの量を定義します。

まさにスレッドのコールスタックの適切な説明がありhere

+0

私に印を付けた人には、正当な理由があるほど親切にしてください。サイズの意味を理解するには、最初にスタックが何であるかを知る必要があります。このことから、サイズが何を指しているのか明確になります。スタックが何であるかについて、より良い説明がありますか? –

1

スタックサイズは、そのうちの一つで、多くのスレッドとstack overflowの可能性を作成するための能力との間のトレードオフだけです。

スタックサイズが増えるほど、作成できるスレッド数が少なくなり、スタックオーバーフローの可能性も低くなります。多くのスレッドを作成する場合(スタックのサイズを小さくする必要がありますが、スタックのオーバーフローについては覚えておく必要があります)、スタックのサイズについて心配する必要があります。それ以外の場合はデフォルト値で十分です。

関連する問題