在使用C或C++编写的多线程嵌入式软件中,必须为线程提供足够的堆栈空间以允许其完成操作而不会溢出。在某些实时嵌入式环境中,正确调整堆栈大小非常关键,因为(至少在我使用过的一些系统中),操作系统将不会为你检测到这一点。
通常,在创建新线程(除主线程外)时指定堆栈大小(即在pthread_create()等函数的参数中)。通常,这些堆栈大小被硬编码为已知好的值,代码编写或测试时就确定了。
但是,对代码的未来更改往往会破坏基于硬编码堆栈大小的假设,然后有一天,您的线程进入其调用图的深层分支并溢出堆栈-导致整个系统崩溃或默默地损坏内存。
我曾亲眼见过这个问题,当代码在线程中执行声明结构实例时,堆栈会增加相应地,从而可能导致堆栈溢出。在已建立的代码库中,这可能是一个巨大的问题,其中添加字段到结构的全部影响可能无法立即知道(因为有太多的线程/函数来找到使用该结构的所有位置)。
由于“堆栈大小”问题的通常回应是“它们不具有可移植性”,因此让我们假设编译器、操作系统和处理器在此调查中都是已知的。同时,假设没有使用递归,因此我们不必处理“无限递归”情况的可能性。
有哪些可靠的方法来估计线程所需的堆栈大小?我更喜欢离线(静态分析)和自动化的方法,但所有想法都受到欢迎。
通常,在创建新线程(除主线程外)时指定堆栈大小(即在pthread_create()等函数的参数中)。通常,这些堆栈大小被硬编码为已知好的值,代码编写或测试时就确定了。
但是,对代码的未来更改往往会破坏基于硬编码堆栈大小的假设,然后有一天,您的线程进入其调用图的深层分支并溢出堆栈-导致整个系统崩溃或默默地损坏内存。
我曾亲眼见过这个问题,当代码在线程中执行声明结构实例时,堆栈会增加相应地,从而可能导致堆栈溢出。在已建立的代码库中,这可能是一个巨大的问题,其中添加字段到结构的全部影响可能无法立即知道(因为有太多的线程/函数来找到使用该结构的所有位置)。
由于“堆栈大小”问题的通常回应是“它们不具有可移植性”,因此让我们假设编译器、操作系统和处理器在此调查中都是已知的。同时,假设没有使用递归,因此我们不必处理“无限递归”情况的可能性。
有哪些可靠的方法来估计线程所需的堆栈大小?我更喜欢离线(静态分析)和自动化的方法,但所有想法都受到欢迎。