我正在使用C++和Windows.h源代码。我在MSDN中阅读了CreateThread API,但仍然不理解指定堆栈大小的实质。默认情况下是1 MB。但如果我指定32字节会发生什么?
线程中的堆栈大小是什么意思?
请提供详细的解释,谢谢。
线程中的堆栈大小是什么意思?
请提供详细的解释,谢谢。
堆栈用于存储局部变量、在函数调用时传递参数、存储返回地址。线程的堆栈具有固定大小,这个大小在创建线程时确定。这就是你正在引用的值。
堆栈大小在创建线程时确定,因为它需要占用连续的地址空间。这意味着线程堆栈的整个地址空间必须在创建线程时被保留。
如果堆栈太小,它就可能溢出。这是一个称为 "堆栈溢出 "的错误条件,这个网站就是从这个错误条件中取名的。在调用函数时,可能会发生以下一些或所有的情况:
所有这些都会消耗堆栈的空间。当函数依次调用另一个函数时,会消耗更多的堆栈空间。随着调用堆栈深度的增加,需要更多的堆栈空间。
因此,将堆栈大小设置得太低的后果是,您可能会耗尽堆栈并导致其溢出。这是一个无法恢复的终端条件。对于几乎所有线程来说,32字节(向上舍入为4096字节)的大小都太小了。
如果您有一个具有大量线程的程序,并且知道线程不需要保留1MB的堆栈大小,则使用较小的堆栈大小可能会带来好处。这样做可以避免耗尽可用的进程地址空间。
另一方面,您可能有一个具有深度调用堆栈的单个线程的程序,该堆栈消耗大量堆栈空间。在这种情况下,您可能会保留超过默认值1MB的大小。
但是,除非您有足够的理由进行更改,否则最好坚持使用默认堆栈大小。
堆栈大小只是创建多个线程的能力和其中一个线程发生堆栈溢出的可能性之间的权衡。
堆栈大小越大,可以创建的线程数量就越少,堆栈溢出的可能性也越小。只有当您打算创建许多线程时,才应该担心堆栈大小(您将不得不降低堆栈大小,但要记住堆栈溢出)。否则,默认值就足够了。
CreateThread
创建使用CRT的线程时存在内存泄漏。据我所知,文档中记录的问题(“如果使用CreateThread创建的线程调用CRT,则CRT可能会在低内存条件下终止进程。”)仍然存在。无论如何,调用_beginthreadex
始终是安全的,并且不会施加任何限制。 - IInspectable