Tamanho da Pilha de Threads

Cada novo thread ou fibra recebe seu próprio espaço de pilha que consiste na memória reservada e inicialmente confirmada. O tamanho da memória reservada representa a alocação total de pilha na memória virtual. Dessa forma, o tamanho reservado é limitado ao intervalo de endereços virtuais. As páginas inicialmente confirmadas não utilizam memória física até que sejam referenciadas; no entanto, eles removem páginas do limite total de confirmação do sistema, que é o tamanho do arquivo de página mais o tamanho da memória física. O sistema confirma páginas adicionais da memória de pilha reservada conforme necessário, até que a pilha atinja o tamanho reservado menos uma página (que é usada como uma página de proteção para evitar o estouro da pilha) ou o sistema fique tão baixo na memória que a operação falha.

É melhor escolher um tamanho de pilha tão pequeno quanto possível e confirmar a pilha necessária para que o thread ou fibra seja executado de forma confiável. Todas as páginas reservadas para a pilha não podem ser usadas para qualquer outra finalidade.

Uma pilha é liberada quando seu thread é encerrado. Ele não será liberado se o thread for encerrado por outro thread.

O tamanho padrão para a memória de pilha reservada e inicialmente confirmada é especificado no cabeçalho do arquivo executável. A criação de thread ou fibra falhará se não houver memória suficiente para reservar ou confirmar o número de bytes solicitados. O tamanho de reserva de pilha padrão usado pelo vinculador é de 1 MB. Para especificar um tamanho de reserva de pilha padrão diferente para todos os threads e fibras, use a instrução STACKSIZE no arquivo de definição do módulo (.def). O sistema operacional arredonda o tamanho especificado para o múltiplo mais próximo da granularidade de alocação do sistema (normalmente 64 KB). Para recuperar a granularidade de alocação do sistema atual, use a função GetSystemInfo .

Para alterar o espaço de pilha inicialmente confirmado, use o parâmetro dwStackSize da função CreateThread, CreateRemoteThread ou CreateFiber . Esse valor é arredondado até a página mais próxima. Em geral, o tamanho da reserva é o tamanho de reserva padrão especificado no cabeçalho executável. No entanto, se o tamanho confirmado inicialmente especificado por dwStackSize for maior ou igual ao tamanho de reserva padrão, o tamanho da reserva será esse novo tamanho de confirmação arredondado para o múltiplo mais próximo de 1 MB.

Para alterar o tamanho da pilha reservada, defina o parâmetro dwCreationFlags de CreateThread ou CreateRemoteThread como STACK_SIZE_PARAM_IS_A_RESERVATION e use o parâmetro dwStackSize . Nesse caso, o tamanho confirmado inicialmente é o tamanho padrão especificado no cabeçalho executável. Para fibras, use o parâmetro dwStackReserveSize de CreateFiberEx. O tamanho confirmado é especificado no parâmetro dwStackCommitSize .

A função SetThreadStackGuarantee define o tamanho mínimo da pilha associada ao thread de chamada ou fibra que estará disponível durante quaisquer exceções de estouro de pilha.