Стек .NET против стека Windows - PullRequest
7 голосов
/ 03 ноября 2010

Внутренняя книга Windows 5-е издание содержит следующий комментарий на странице 360.

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 03 ноября 2010

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

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

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

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

0 голосов
/ 03 ноября 2010

Вот аналогичное обсуждение по теме.

Вопрос

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

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

Ответ

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...