线程堆栈大小

每个新线程或光纤都接收自己的堆栈空间,该空间由保留的和最初提交的内存组成。 保留内存大小表示虚拟内存中的堆栈分配总量。 因此,保留大小限制为虚拟地址范围。 最初提交的页面在被引用之前不会利用物理内存;但是,它们确实从系统的总提交限制中删除页面,即页面文件大小加上物理内存的大小。 系统根据需要从保留堆栈内存提交其他页面,直到堆栈达到保留大小减去一页(这用作保护页以防止堆栈溢出)或系统内存太低,以至于作失败。

最好选择尽可能小的堆栈大小,并提交线程或光纤可靠运行的堆栈。 为堆栈保留的每个页面都不能用于任何其他目的。

堆栈在线程退出时释放。 如果线程被另一个线程终止,则不会释放该线程。

保留和最初提交的堆栈内存的默认大小在可执行文件头中指定。 如果没有足够的内存来保留或提交请求的字节数,线程或光纤创建将失败。 链接器使用的默认堆栈预留大小为 1 MB。 若要为所有线程和光纤指定不同的默认堆栈预留大小,请在模块定义 (.def) 文件中使用 STACKSIZE 语句。 作系统将指定的大小舍入到系统分配粒度(通常为 64 KB)的最接近倍数。 若要检索当前系统的分配粒度,请使用 GetSystemInfo 函数。

若要更改最初提交的堆栈空间,请使用 createThreadCreateRemoteThreadCreateFiber 函数的dwStackSize 参数。 此值向上舍入到最接近的页面。 通常,保留大小是可执行文件标头中指定的默认保留大小。 但是,如果由 dwStackSize 指定的最初提交大小大于或等于默认保留大小,则保留大小是此新提交大小向上舍入为最接近的 1 MB 倍数。

若要更改保留的堆栈大小,请将 CreateThreadCreateRemoteThreaddwCreationFlags 参数设置为STACK_SIZE_PARAM_IS_A_RESERVATION并使用 dwStackSize 参数。 在这种情况下,最初提交的大小是可执行文件标头中指定的默认大小。 对于光纤,请使用 CreateFiberExdwStackReserveSize 参数。 提交的大小在 dwStackCommitSize 参数中指定。

SetThreadStackGuarantee 函数设置与调用线程或光纤关联的堆栈的最小大小,该堆栈将在任何堆栈溢出异常期间可用。