【发布时间】:2011-08-05 05:04:12
【问题描述】:
我刚刚阅读了 Google Go 如何在默认情况下使每个线程的堆栈大小减小,然后在发生溢出时链接到新堆栈(请参阅 here 中的第 16 页)。我想知道在 C 中做到这一点的最佳方法。
我不得不说我不是 C 专家,所以可能有更好的方法来检测 C 上的堆栈溢出,但鉴于我的无知,以下是我认为我会如何实现它:
我想到的第一件事是,每次我们有一个新的堆栈时,我们都会得到一个堆栈变量的地址,然后我们就大致有了起始堆栈地址。然后我们需要能够检索线程有多少堆栈空间。如果线程不是主线程,这是可能的,但我不知道我们如何在 C 上获取这些信息。
然后我们需要通过检索当前堆栈变量地址来检查(每个函数调用,可能是)已经使用了多少堆栈。如果我们检测到可能的堆栈溢出,我们需要有一些方法来创建一个新堆栈并链接到最后一个堆栈。我认为可以在 C 中完成的唯一方法是创建一个新线程来执行我们想要的函数,并锁定当前线程直到函数返回其结果。
那么,是否有更清洁/更好的方法来实现这一点?
【问题讨论】:
-
我不确定我是否喜欢你的反溢出态度。你确定你没有在错误的网站上;)
-
请注意,拆分堆栈没有什么是无溢出的。
malloc(或用于分配新堆栈片段的任何方法)仍然可能失败,并且应用程序无法检测和处理此问题。
标签: c go stack-overflow c89