线程堆栈大小
每个新线程或光纤都接收自己的堆栈空间,这些空间由保留内存和最初提交的内存组成。 保留的内存大小表示虚拟内存中的总堆栈分配。 因此,保留的大小仅限于虚拟地址范围。 最初提交的页面在被引用之前不会利用物理内存;但是,它们确实从系统总提交限制中删除页面,即页面文件的大小加上物理内存的大小。 系统根据需要从保留堆栈内存提交其他页,直到堆栈达到保留大小减去一页 (用作保护页以防止堆栈溢出) ,或者系统内存太低,导致操作失败。
最好选择尽可能小的堆栈大小,并提交线程或光纤可靠运行所需的堆栈。 为堆栈保留的每个页面都不能用于任何其他目的。
堆栈在线程退出时被释放。 如果线程被另一个线程终止,则不会释放该线程。
保留和最初提交的堆栈内存的默认大小在可执行文件标头中指定。 如果没有足够的内存来保留或提交请求的字节数,则线程或光纤创建失败。 链接器使用的默认堆栈预留大小为 1 MB。 若要为所有线程和光纤指定不同的默认堆栈预留大小,请使用模块定义 (.def) 文件中的 STACKSIZE 语句。 操作系统将指定大小舍入为系统分配粒度的最近倍数, (通常为 64 KB) 。 若要检索当前系统的分配粒度,请使用 GetSystemInfo 函数。
若要更改最初提交的堆栈空间,请使用 CreateThread、CreateRemoteThread 或 CreateFiber 函数的 dwStackSize 参数。 此值向上舍入到最近的页面。 通常,保留大小是在可执行标头中指定的默认保留大小。 但是,如果 dwStackSize 指定的初始提交大小大于或等于默认保留大小,则保留大小为此新提交大小,向上舍入为最接近的 1 MB 倍数。
若要更改保留的堆栈大小,请将 CreateThread 或 CreateRemoteThread 的 dwCreationFlags 参数设置为 STACK_SIZE_PARAM_IS_A_RESERVATION并使用 dwStackSize 参数。 在这种情况下,初始提交的大小是可执行文件标头中指定的默认大小。 对于光纤,请使用 CreateFiberEx 的 dwStackReserveSize 参数。 提交大小在 dwStackCommitSize 参数中指定。
SetThreadStackGuarantee 函数设置与调用线程或光纤关联的堆栈的最小大小,这些堆栈在任何堆栈溢出异常期间都可用。