在多线程嵌入式软件(用C或C++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出.在某些实时嵌入式环境中,正确调整堆栈大小至关重要,因为(至少在我使用过的某些系统中),操作系统不会为您检测到这一点.
通常,在创建线程时(即在pthread_create()等的参数中)指定新线程(除主线程之外)的堆栈大小.通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值.
但是,对代码的未来更改通常会破坏硬编码堆栈大小所基于的假设,并且在一个重要的日子里,您的线程进入其调用图的更深层分支之一并溢出堆栈 - 从而导致整个系统崩溃或者默默地腐蚀记忆.
在线程中执行的代码在堆栈上声明struct实例的情况下,我个人已经看到了这个问题.当结构体被扩充以容纳额外数据时,堆栈大小相应地膨胀,可能允许堆栈溢出发生.我想这对于已建立的代码库来说可能是一个巨大的问题,其中无法立即知道向结构添加字段的全部效果(太多的线程/函数来查找使用该结构的所有位置).
由于对"堆栈大小"问题的通常响应是"它们不可移植",因此我们假设编译器,操作系统和处理器都是此调查的已知数量.我们也假设没有使用递归,所以我们没有处理"无限递归"场景的可能性.
有哪些可靠的方法来估计线程所需的堆栈大小?我更喜欢离线(静态分析)和自动方法,但欢迎所有想法.
是否有调用来确定正在运行的线程的堆栈大小?我一直在寻找MSDN线程函数文档,似乎无法找到一个.