微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C90中实现无溢出系统堆栈

如何解决在C90中实现无溢出系统堆栈

我只是在阅读有关Google Go认情况下如何使每个线程的堆栈大小减小的信息,然后在发生溢出时链接到新堆栈(请参阅此处的第16页)。我想知道用C做到这一点的最佳方法。 我必须说我不是C专家,所以可能会有更好的方法来检测C上的堆栈溢出,但是由于我的无知,这是我认为自己将如何实现它: 我想到的第一件事是,每当我们有一个新的新堆栈时,我们都会获得一个堆栈变量的地址,并由此获得一个大致的起始堆栈地址。然后,我们将需要能够检索线程有多少堆栈空间。如果线程不是主线程,这将是可能的,但是我不知道我们如何获得有关C的信息。 然后,我们需要通过检索当前的堆栈变量地址来检查(可能是每个函数调用)已经使用了多少堆栈。如果我们检测到可能的堆栈溢出,则需要某种方式来创建新堆栈并链接到最后一个堆栈。我认为可以用C语言完成的唯一方法是创建一个新线程来执行所需的函数,并锁定当前线程,直到函数返回结果。 那么,会有没有更清洁/更好的方法来实现这一目标?     

解决方法

请参阅GCC的拆分堆栈功能。我相信这最初是为了支持Go而实现的。它几乎可以按照您的建议工作。 编辑:下面的评论讨论了另一个执行激活记录的堆分配的系统。     ,您可以执行此操作-我相信现代的gcc甚至可以选择它-但它大大增加了函数调用的成本,并且几乎没有实际收益。尤其是在具有64位寻址的现代系统上,每个线程都有足够的地址空间来拥有自己的堆栈,而这些堆栈与每个其他线程的堆栈都相距甚远。如果您发现自己使用的不只是对数级调用递归,那么您的算法总有问题...     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。