【问题标题】:What does stack size in a thread define in C++?线程中的堆栈大小在 C++ 中定义是什么?
【发布时间】:2016-02-15 21:45:55
【问题描述】:

我在我的源代码中使用 C++ 和 Windows.h。看了MSDN中的CreateThread API,但还是不明白指定栈大小的本质。默认情况下为 1 MB。但是如果我指定 32 字节会发生什么?

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

请提供详尽的解释,我将不胜感激。谢谢。

【问题讨论】:

  • 您链接的页面是这样的:更多信息,请参阅Thread Stack Size。请阅读您自己链接到的文档。
  • 可能要求 32 字节的堆栈甚至是不可能的,最小大小应该是一个内存页(通常是 4 KB)。
  • 与您的问题无关,但在使用 C++ 时,您应该调用_beginthreadex 而不是CreateThread。这在文档中有明确说明。
  • 有一个非常简单的方法来找出发生了什么。试试看。
  • 供参考,说明您需要使用 _beginthreadex 的文档已过时。如果您使用的是 Vista 或更高版本,并且您的 Visual Studio 版本没有无可救药地过时,那么 CreateThread 也可以正常工作。 (幸运的是,因为您通常没有选择权!)

标签: c++ multithreading winapi stack


【解决方案1】:

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

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

如果堆栈太小,它可能会溢出。这是一种称为 stackoverflow 的错误情况,本网站的名称就是由此而来。当您调用函数时,会发生以下部分或全部情况:

  • 参数被压入堆栈。
  • 返回地址被压入堆栈。
  • 创建了一个包含函数局部变量空间的堆栈帧。

所有这些都会占用堆栈空间。当该函数又调用另一个函数时,会消耗更多的堆栈空间。随着调用堆栈越来越深,需要更多的堆栈空间。

因此,将堆栈大小设置得太低的后果是您可能会耗尽堆栈并使其溢出。这是你无法恢复的绝症。当然 32 字节(四舍五入为 4096 字节的一页)对于几乎所有线程来说都太小了。

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

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

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

【讨论】:

  • 也许只有我一个人,但在第二段中,您似乎在说您必须保留整个进程地址空间,也许您应该改写那句话。此外,添加一些您可能有兴趣为线程堆栈大小设置较低或较高值的情况示例可能会很有趣。
  • 赞成,我认为这是一个好的答案。第二段看起来不错。它不一定适用于未来实施的其他信息可能会比澄清更令人困惑。
【解决方案2】:

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

堆栈大小越大,您可以创建的线程数越少,堆栈溢出的可能性就越小。仅当您要创建许多线程时才应该担心堆栈大小(您将不得不降低堆栈大小,但请记住堆栈溢出)。否则默认值就足够了。

【讨论】:

    【解决方案3】:

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

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

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

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

    关于线程调用堆栈到底是什么here有很好的描述

    【讨论】:

    • 谁曾经给我打过分,请给我一个很好的理由。要了解大小指的是什么,首先需要知道堆栈是什么。由此可以清楚地知道大小指的是什么,不是吗?有什么更好的解释那个堆栈是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2015-12-09
    • 2015-04-23
    • 2011-01-29
    • 2015-10-23
    • 2015-11-11
    • 2011-07-27
    相关资源
    最近更新 更多