3 回答
TA贡献1845条经验 获得超8个赞
通常,您可以main()在调用任何其他函数之前,例如在的开始处及早设置堆栈大小。通常,逻辑为:
调用getrlimit以获取当前堆栈大小
如果当前大小<所需的堆栈大小,则
调用setrlimit以将堆栈大小增加到所需大小
在C语言中,可能会这样编码:
#include <sys/resource.h>
#include <stdio.h>
int main (int argc, char **argv)
{
const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < kStackSize)
{
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "setrlimit returned result = %d\n", result);
}
}
}
// ...
return 0;
}
TA贡献1802条经验 获得超5个赞
要超出setrlimit中的硬限制(在OSX上默认只有64MB),请使用具有选择的堆栈大小的pthreads创建一个新线程。这是一个C代码段:
// Call function f with a 256MB stack.
static int bigstack(void *(*f)(void *), void* userdata) {
pthread_t thread;
pthread_attr_t attr;
// allocate a 256MB region for the stack.
size_t stacksize = 256*1024*1024;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, stacksize);
int rc = pthread_create(&thread, &attr, f, userdata);
if (rc){
printf("ERROR: return code from pthread_create() is %d\n", rc);
return 0;
}
pthread_join(thread, NULL);
return 1;
}
- 3 回答
- 0 关注
- 461 浏览
添加回答
举报