Размер стека потоков
Каждый новый поток или волокна получает собственное пространство стека, состоящее как из зарезервированной, так и первоначально зафиксированной памяти. Размер зарезервированной памяти представляет общее выделение стека в виртуальной памяти. Таким образом, зарезервированный размер ограничен диапазоном виртуальных адресов. Изначально зафиксированные страницы не используют физическую память, пока они не будут ссылаются; однако они удаляют страницы из общего ограничения фиксации системы, что является размером файла страницы плюс размер физической памяти. Система фиксирует дополнительные страницы из зарезервированной памяти стека по мере их необходимости, пока стек не достигнет зарезервированного размера минус одной страницы (которая используется в качестве охранной страницы для предотвращения переполнения стека) или система настолько низка в памяти, что операция завершается сбоем.
Рекомендуется выбрать как можно меньше размера стека и зафиксировать стек, необходимый для надежного выполнения потока или волокна. Каждая страница, зарезервированная для стека, не может использоваться для любой другой цели.
Стек освобождается при выходе потока. Он не освобождается, если поток завершается другим потоком.
Размер зарезервированной и первоначально зафиксированной памяти стека по умолчанию указывается в заголовке исполняемого файла. Создание потока или волокна завершается ошибкой, если недостаточно памяти для резервирования или фиксации запрошенного количества байтов. Размер резервирования стека по умолчанию, используемый компоновщиком, составляет 1 МБ. Чтобы указать другой размер резервирования стека по умолчанию для всех потоков и волокон, используйте инструкцию STACKSIZE в файле определения модуля (.def). Операционная система округляет указанный размер до ближайшего числа детализации распределения системы (обычно 64 КБ). Чтобы получить степень детализации распределения текущей системы, используйте функцию GetSystemInfo.
Чтобы изменить изначально зафиксированное пространство стека, используйте параметр dwStackSize функции CreateThread, CreateRemoteThreadThreadили функцию CreateFiber. Это значение округляется до ближайшей страницы. Как правило, размер резерва — это размер резерва по умолчанию, указанный в заголовке исполняемого файла. Однако если изначально зафиксированный размер, указанный dwStackSize больше или равен размеру резерва по умолчанию, размер резерва округляется до ближайшего кратного 1 МБ.
Чтобы изменить размер зарезервированного стека, задайте параметр dwCreationFlagsCreateThread или CreateRemoteThreadThread STACK_SIZE_PARAM_IS_A_RESERVATION и используйте параметр dwStackSize. В этом случае изначально зафиксированный размер — это размер по умолчанию, указанный в заголовке исполняемого файла. Для волокон используйте параметр dwStackReserveSizeCreateFiberEx. Размер фиксации указывается в параметре dwStackCommitSize.
Функция SetThreadStackGuarantee задает минимальный размер стека, связанного с вызывающим потоком или волокнами, которые будут доступны во время исключений переполнения стека.