2010-11-03 8 views
7

Le Windows Internal book 5th edition a le commentaire suivant à la page 360.La pile .NET vs pile de Windows

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

Je comprends que pour Windows OS, chaque thread est donné 4K ou 16K (selon le système) pile, et la taille est fixe.

Alors qu'en est-il de la pile dans .NET?

  • Quelle est la taille de la pile?
  • La taille de la pile est fixe ou variable?
  • La pile est-elle allouée à chaque thread comme dans le cas de Windows?
+0

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

Répondre

9

Oui, la taille du fil de démarrage est déterminé par une valeur dans l'en-tête de fichier .EXE. Nécessairement, c'est le système d'exploitation qui crée le fil, avant tout code dans le programme peut fonctionner. Il appelle l'entrypoint du programme, CorExeMain().

Le compilateur géré que vous utilisez écrit cette valeur dans l'en-tête du fichier EXE. Les compilateurs .NET actuels sélectionnent 1 Mo lorsque vous ciblez x86 ou Any CPU, 4 Mo lorsque vous ciblez x64. Ceci n'est cependant pas corrigé, vous pouvez modifier la valeur avec l'utilitaire Editbin.exe, option de ligne de commande/STACK. Vous pouvez utiliser cet événement après génération pour obtenir une pile de 2 Mo:

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

La taille de la pile pour les fils que vous créez sont sous votre contrôle, le constructeur de la classe Thread has overloads qui vous permet de spécifier la taille. Vous ne pouvez pas le rendre trop petit, si les clips la valeur à 256 Ko. C'est nécessaire, le compilateur juste-à-temps utilise également la pile.

0

Voici un similar discussion sur le sujet.

Question

La documentation indique que les fils "taille de la pile par défaut" est 1Mo. Le travail "par défaut" implique qu'il peut être changé. Est-il possible de changer StackSize dans .NET?

Si c'est le cas, comment?

Réponse

Malheureusement pas. La documentation que vous étiez en train de lire concernait la création de nouveaux threads dans le système, qui est géré par la classe Thread. La fonction CreateThread API vous permet de définir la taille de la pile et vous pouvez l'appeler à partir de 0. NET à partir de . Cependant, je ne sais pas si c'est une bonne idée, puisque je ne suis pas sûr de la façon dont le moteur d'exécution percevra ce fil.

Voici un exemple de code pour créer des threads en utilisant l'API CreateThread

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