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

我刚刚读到Google Go默认情况下如何使每个线程的堆栈大小减少,然后如果发生溢出则链接到新堆栈(参见 here中的第16页).我想知道用C做最好的方法.

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

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

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

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

谢谢!

解决方法

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

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...