2010-11-03 3 views
7

Windows Internal book 5th edition имеет следующий комментарий в странице 360.стек .NET против стека Windows,

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

Я понимаю, что для ОС Windows, каждый поток задается 4K или 16K (в зависимости от системы) стека и размер фиксирован.

Тогда как насчет стека в .NET?

  • Насколько велик стек?
  • Размер стека фиксированный или переменный?
  • Является ли стек выделенным для каждого потока точно так же, как в случае с Windows?
+0

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

ответ

9

Да, размер резьбы запуска определяется значением в заголовке .EXE файла. Обязательно так, именно ОС создает поток, до любой код в программе может работать. Он вызывает точку входа программы, CorExeMain().

Управляемый компилятор, который вы используете, записывает это значение в заголовок EXE-файла. Текущие компиляторы .NET выбирают 1 МБ, когда вы нацеливаетесь на x86 или Any CPU, 4 МБ, когда вы нацеливаетесь на x64. Это, однако, не исправлено, вы можете изменить значение с помощью утилиты Editbin.exe,/командной строки STACK. Вы можете использовать это после сборки событие, чтобы получить стек 2MB:

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

размер стека для потоков, которые вы создаете сами находятся под вашим контролем, класс Thread конструктор has overloads, который позволяет указать размер. Вы не можете сделать его слишком маленьким, если его значение составляет 256 КБ. Это необходимо, компилятор «точно в срок» также использует стек.

0

Вот similar discussion по теме.

Вопрос

документация указывает на то, что темы «размер стека по умолчанию» 1 МБ. Работа «default» означает, что его можно изменить.

Можно ли изменить StackSize в .NET? Если да, то как?

Ответ

К сожалению, нет. Документация, которую вы читали, была для создания новых потоков в системе, которая обрабатывается классом Thread. Функция CreateThread API позволяет установить размер стека, и вы можете позвонить из .NET. Тем не менее, я не знаю, хорошая ли это идея, так как я не уверен, как среда выполнения увидит этот поток.

Вот пример кода для создания потоков с использованием API CreateThread

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

Смежные вопросы