在阅读有关如何在编译时为使用gnu编译的c++应用程序增加堆栈大小的信息时,我了解到可以在程序开始时使用setrlimit来完成此操作。然而,我找不到任何成功的例子来说明如何使用它,以及在程序的哪个部分应用它,以便为c++程序获得64M的堆栈大小,有人能帮我吗?
谢谢
发布于 2010-02-17 15:54:15
看看运行时执行的最大值是否限制了它:
[wally@zf conf]$ ulimit -all
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16114
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16114
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
请注意,默认情况下,堆栈大小限制为10 MiB。因此,要将其增加到64 MiB:
[wally@zf conf]$ ulimit -s 64M
-bash: ulimit: 64M: invalid number
[wally@zf conf]$ ulimit -s 65536
[wally@zf conf]$ ulimit -all
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16114
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 65536
cpu time (seconds, -t) unlimited
max user processes (-u) 16114
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
发布于 2012-02-15 00:58:42
要超过setrlimit的硬限制(在OSX上,默认情况下它只有64MB ),可以使用pthread创建一个新线程,它的堆栈大小是您选择的。下面是一个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;
}
https://stackoverflow.com/questions/2279052
复制相似问题