在ANSI C中实现无溢出的系统堆栈

前端之家收集整理的这篇文章主要介绍了在ANSI C中实现无溢出的系统堆栈前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚读到Google Go默认情况下如何使每个线程的堆栈大小减少,然后如果发生溢出则链接到新堆栈(参见 here中的第16页).我想知道用C做最好的方法.

我不得不说我不是C专家,所以可能有更好的方法来检测C上的Stack Overflow,但是让我无知,这就是我认为我会实现它的方式:

我想的第一件事是每次我们有一个新的堆栈时,我们得到一个堆栈变量的地址,并且我们大致有起始堆栈地址.然后我们需要能够检索线程有多少堆栈空间.如果线程不是主线程,这是可能的,但我不知道如何在C上获取此信息.

然后我们需要通过检索当前堆栈变量地址来检查(每个函数调用,它可能是)已经使用了多少堆栈.如果我们检测到可能的堆栈溢出,我们需要有一些方法来创建一个新的堆栈并链接到最后一个堆栈.我认为可以在C中完成的唯一方法是创建一个新线程来执行我们想要的函数,并锁定当前线程直到函数返回其结果.

那么,是否有更清洁/更好的方法来实现这一点?

谢谢!

解决方法

请参阅GCC的 split-stack capability.我相信这最初是为了支持Go而实施的.它几乎按照你的建议工作.

编辑:下面的评论讨论了另一个进行激活记录堆分配的系统.

猜你在找的C&C++相关文章