2017-02-06 3 views
-1

После прочтения this и this поста я провел очень простую программу на C# показано ниже:1 МБ ограничения размера стека, установленного CLR, для потока или всего приложения/процесса?

static void Main(string[] args) 
{ 
    Thread t = new Thread(new ThreadStart(myFunc), 2097152); 
    t.start(); 
} 

Второй параметр конструктора Thread класса является размер (в байтах) стека, которые будут выделены для потока. Номер 2097152 эквивалентен 2 мегабайтам. Но моя программа по-прежнему работает без ошибок? Если моя программа не выдает ошибку при распределении пространства стека (ограничение составляет 1 МБ для самого полного приложения) для этого потока или я пропускаю что-то очень очевидное. Первоначально я думал, что это может быть проверка компилятора.

Как CLR обеспечивает размер распределения стека для потока, чтобы он не нарушал границы?

P.S. : Мое приложение - 32-битное консольное приложение.

+0

Что такое «ограничение размера стека на 1 МБ»? Размер стека по умолчанию для потока равен 1 МБ, но это не является жестким пределом. И параметр, который вы передаете, на самом деле является способом изменения этого значения по умолчанию. Пожалуйста, уточните, что вы просите. –

+0

Откуда у вас возникла идея, что стек может быть только 1 МБ? Поскольку вы создаете стек размером 2 МБ, очевидно, что ваше убеждение в том, что стек может быть только 1 МБ, является ложным, так почему вы в это верите? –

+1

Это было мое первое знакомство с этим ограничением в Windows сегодня. Фактически, теперь я понял, что это не предел, а конфигурация, которая может быть изменена для каждой нити. Первая строка на [this] (http://stackoverflow.com/questions/823724/stack-capacity-in -c-sharp) помог мне в другом направлении - «Размер стека по умолчанию для приложения .NET составляет 1 МБ (по умолчанию 256 КБ для 32-разрядных приложений ASP.NET и 512 КБ для 64-разрядных приложений ASP.NET) '. Любые сообщения, которые я упоминал, не использовали термин 'per-thread' даже один раз во всей полноте. Для первого таймера это может быть не так просто понять. – RBT

ответ

3

1 МБ - это размер стека по умолчанию за потоки, а не для всего приложения. Каждый поток имеет свой собственный стек. Когда вы указываете другой размер стека в конструкторе потока, вы переопределяете значение по умолчанию для этого потока.

Если вы хотите протестировать пределы размера стека, вам нужно будет вызвать рекурсивную функцию до тех пор, пока стек не будет заполнен и не переполнен (отсюда имя этого сайта). Просто создавая больше потоков, вы просто создадите больше стеков.

+1

Теперь я понял. Это не предел, а настраиваемое значение, связанное с потоком, которое может быть изменено. 1 МБ - это стандартная конфигурация, предполагаемая окнами, если мы не укажем ничего при создании потока. Как только мы устанавливаем это значение, оно становится пределом, который выдает исключение «StackOverflow», если оно пересечено из-за хранения локальных переменных метода (которые хранятся в стеке) или фреймов стека, используемых для поддержания вызовов методов. Теперь я получил лучшую картину, что память стека очень связана с потоком, а не с процессом. – RBT

2

As per Microsoft documentation,

«Начиная с .NET Framework 4, только полностью доверенный код может установить maxStackSize на значение, которое больше, чем размер стека по умолчанию (1 мегабайт). Если большее значение для указанного maxStackSize когда код работает с частичным доверием, maxStackSize игнорируется и используется размер стека по умолчанию. Исключено исключение. Код на любом уровне доверия может установить maxStackSize на значение, меньшее размера стека по умолчанию. "

+0

Очень хорошая информация. Приятно знать эти внутренние детали о ограничении кода partil-trust w.r.t. maxStackSize. – RBT

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