2010-11-03 12 views
7

Die Windows Internal book 5th edition hat folgenden Kommentar in Seite 360..NET Stack vs Windows-Stack

 
The stack size for the initial thread is taken from the image—there’s no way 
to specify another size. 

Ich verstehe, dass für Windows OS, jeder Thread 4K oder 16K gegeben (je nach System) Stapel, und die Größe ist festgelegt.

Dann wie wäre es mit dem Stack in .NET?

  • Wie groß ist der Stapel?
  • Die Größe des Stapels ist fest oder variabel?
  • Ist der Stack für jeden Thread genau wie im Fall von Windows zugeordnet?
+0

verwandt: http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed-executable-net –

Antwort

9

Ja, ist die Größe für das Startgewinde durch einen Wert in den EXE-Datei-Header zu schaffen bestimmt wird. Unbedingt, es ist das Betriebssystem, das den Thread erstellt, vor beliebigen Code im Programm ausgeführt werden kann. Es ruft den Einstiegspunkt des Programms, CorExeMain().

Der verwaltete Compiler, den Sie verwenden, schreibt diesen Wert in den Header der EXE-Datei. Aktuelle .NET-Compiler wählen 1 MB, wenn Sie x86 oder Any CPU, 4 MB, wenn Sie x64 zielen. Dies ist jedoch nicht behoben, Sie können den Wert mit dem Editbin.exe-Dienstprogramm,/STACK Befehlszeilenoption ändern. Sie könnten diese Post-Build-Ereignis verwenden, um einen 2MB-Stack zu erhalten:

set path=%path%;$(DevEnvDir);$(DevEnvDir)..\..\vc\bin 
    editbin.exe /STACK:2097152 "$(TargetPath)" 

die Stackgröße für Threads, die Sie selbst erstellen unter Ihrer Kontrolle sind, die Thread-Klasse Konstruktor has overloads, dass Sie die Größe festlegen können. Sie können es nicht zu klein machen, wenn der Wert auf 256 KB begrenzt wird. Das ist notwendig, der Just-in-Time-Compiler verwendet auch den Stack.

0

Hier ist eine similar discussion zum Thema.

Frage

Die Dokumentation zeigt an, dass die Themen "Standard-Stack-Größe" 1 MB ist. Die Arbeit "Standard" bedeutet, dass es geändert werden kann.

Ist es möglich, die StackSize in .NET zu ändern? Wenn das so ist, wie?

Antwort

Leider nein. Die Dokumentation, die Sie gelesen haben, war für die Erstellung neuer Threads im System, die von der Thread-Klasse behandelt wird. Die CreateThread API-Funktion ermöglicht es Ihnen, die Stapelgröße festzulegen, und Sie können von .NET aufrufen. Allerdings weiß ich nicht, ob das eine gute Idee ist, da ich mir nicht sicher bin, wie die Laufzeit diesen Thread wahrnimmt.

Hier ist ein Code-Beispiel für Fäden mit der Create API

http://www.codeproject.com/KB/threads/Threads_1.aspx