线程中的堆栈大小在C++;? 我在我的源代码中使用C++和Windows .h。我在中阅读了CreateThread API,但仍然不理解指定堆栈大小的本质。默认值为1MB。但是如果我指定32字节,会发生什么呢

线程中的堆栈大小在C++;? 我在我的源代码中使用C++和Windows .h。我在中阅读了CreateThread API,但仍然不理解指定堆栈大小的本质。默认值为1MB。但是如果我指定32字节,会发生什么呢,c++,multithreading,winapi,stack,C++,Multithreading,Winapi,Stack,线程中的堆栈大小定义了什么 请详细解释,我将不胜感激。谢谢。堆栈用于存储局部变量、在函数调用中传递参数、存储返回地址。线程的堆栈具有固定大小,该大小在创建线程时确定。这也是你所指的价值观 堆栈大小在创建线程时确定,因为它需要占用连续的地址空间。这意味着在创建线程时必须保留线程堆栈的整个地址空间 如果堆栈太小,则可能溢出。这是一种称为堆栈溢出的错误情况,该网站就是从中得名的。调用函数时,会发生以下部分或全部情况: 参数被推送到堆栈上 返回地址被推送到堆栈上 将创建一个包含函数局部变量空间的堆栈框

线程中的堆栈大小定义了什么


请详细解释,我将不胜感激。谢谢。

堆栈用于存储局部变量、在函数调用中传递参数、存储返回地址。线程的堆栈具有固定大小,该大小在创建线程时确定。这也是你所指的价值观

堆栈大小在创建线程时确定,因为它需要占用连续的地址空间。这意味着在创建线程时必须保留线程堆栈的整个地址空间

如果堆栈太小,则可能溢出。这是一种称为堆栈溢出的错误情况,该网站就是从中得名的。调用函数时,会发生以下部分或全部情况:

  • 参数被推送到堆栈上
  • 返回地址被推送到堆栈上
  • 将创建一个包含函数局部变量空间的堆栈框架
所有这些都会消耗堆栈中的空间。当函数依次调用另一个函数时,会消耗更多的堆栈空间。随着调用堆栈的深入,需要更多的堆栈空间

因此,将堆栈大小设置得过低的结果是,可能会耗尽堆栈并使其溢出。这是一种无法恢复的终端状态。当然,32字节(四舍五入到一页,即4096字节)对于几乎所有线程来说都太小了

如果你有一个有很多线程的程序,并且你知道线程不需要保留1MB的堆栈大小,那么使用较小的堆栈大小会有好处。这样做可以避免耗尽可用的进程地址空间

另一方面,您可能有一个具有单个线程的程序,该程序具有消耗大量堆栈空间的深层调用堆栈。在这种情况下,您可能会保留超过默认1MB的空间

但是,除非您有充分的理由不这样做,否则最好坚持默认堆栈大小

但是如果我指定32字节,会发生什么呢

我没有阅读Windows文档,但如果Windows允许(仅指定32字节),则很可能会出现堆栈溢出。根据他们的文档,该值在任何情况下都会向上舍入到页面大小,因此实际上堆栈大小至少是页面大小。创建的线程假定存在足够的“堆栈空间”供其使用(用于分配自动变量、存储函数地址等),并根据需要分配空间。当堆栈空间不足时,堆栈分配器可能会使用无效内存,从而覆盖其他地方使用的内存

线程中的堆栈大小定义了什么

它定义了线程堆栈将分配多少内存以供使用


对于线程调用堆栈的确切含义有一个很好的描述

堆栈大小只是在创建多个线程的能力和在其中一个线程中创建线程的可能性之间进行权衡


堆栈大小越大,可以创建的线程数越少,堆栈溢出的可能性越小。只有在要创建多个线程时,才应该担心堆栈大小(必须降低堆栈大小,但要记住堆栈溢出)。否则,默认值就足够了。

您链接的页面有以下内容:有关更多信息,请参阅。请阅读您自己链接的文档。可能要求32字节的堆栈甚至不可能,最小大小应该是一个内存页(通常为4 KB)。与您的问题无关,但是当使用C++时,您应该调用而不是。文档中明确说明了这一点。有一种非常简单的方法可以找出发生了什么。试试看。作为参考,说明您需要使用_beginthreadex的文档已经过时了。如果您使用的是Vista或更高版本,并且您的VisualStudio版本还没有完全过时,CreateThread也可以工作。(幸运的是,因为你通常没有选择的余地!)曾经给我打分的人,请给出一个好的理由。要理解大小指的是什么,首先需要知道堆栈是什么。从这一点可以清楚地看出,尺寸指的是什么,不是吗?有什么更好的解释来解释什么是堆栈呢?也许只是我,但在第二段中,你似乎在说你必须保留整个进程的地址空间,也许你应该改写那句话。另外,添加一些示例可能会很有趣,您可能有兴趣为线程堆栈大小设置一个较低或较高的值。第二段看起来不错。它不一定为将来的实现保留的其他信息可能会比澄清更令人困惑。