我在源代码中使用C和
Windows.h.我在
MSDN中阅读了CreateThread API,但我仍然不明白指定堆栈大小的本质.默认情况下,它是1 MB.但如果我指定32个字节会发生什么?
线程中的堆栈大小定义了什么?
请提供详尽的解释,我将不胜感激.谢谢.
解决方法
堆栈用于存储局部变量,在函数调用中传递参数,存储返回地址.线程的堆栈具有固定大小,该大小在创建线程时确定.这也是你所指的价值.
在创建线程时确定堆栈大小,因为它需要占用连续的地址空间.这意味着必须在创建线程时保留线程堆栈的整个地址空间.
如果堆栈太小,那么它可能会溢出.这是一个称为堆栈溢出的错误情况,本网站以此命名.当您调用某个函数时,会发生以下部分或全部:
>参数被压入堆栈.
>返回地址被压入堆栈.
>创建包含函数局部变量空间的堆栈帧.
所有这些都消耗了堆栈中的空间.当函数依次调用另一个函数时,会消耗更多的堆栈空间.随着调用堆栈的深入,需要更多的堆栈空间.
因此,将堆栈尺寸设置得过低的后果是,您可以耗尽堆栈并使其溢出.这是您无法恢复的终端条件.当然,32个字节(向上舍入到一个页面,即4096个字节)对于几乎所有线程来说都太小了.
如果你有一个包含大量线程的程序,并且你知道线程不需要保留1MB的堆栈大小,那么使用较小的堆栈大小会有好处.这样做可以避免耗尽可用的进程地址空间.
另一方面,您可能有一个程序,其中一个线程具有深度调用堆栈,这会占用大量的堆栈空间.在这种情况下,您可能会保留超过默认的1MB.
但是,除非你有充分的理由不这样做,否则最好坚持使用默认的堆栈大小.