我正在使用QtConcurrent / QThreadPool,它正在创建堆栈大小的线程,在Mac OS X 10.8(512kB)上太小,但在CentOS 5.9(10MB)上很好。
我希望有一个解决方法,我可以为新线程设置一些进程范围的默认值'堆栈大小。我只关心类似POSIX的系统(Mac和Linux)而不是Windows。
我的问题是如何在程序中或通过环境变量或其他方式在运行程序之前为新的QThreadPool线程设置默认堆栈大小?
通过设置pthread_create
创建的线程的默认值来实现效果的答案也很有用。
我试图解决这个问题:
我的预感是Qt正在使用pthreads,如果我可以更改pthreads的默认堆栈大小,我的问题可能会解决。
pthread文档说:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
说明
pthread_create()函数用于创建新线程 attr在进程内指定的属性。 如果attr为NULL,则为 使用默认属性。等...
我知道如何获取默认值:
size_t stacksize;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_getstacksize (&attr, &stacksize);
但是我没有找到设置默认值的方法 - 只是通过将pthread_attr_t
传递给pthread_create
来设置尺寸。
有没有办法设置默认值?
是否有一些环境变量或其他方法来影响默认值?
答案 0 :(得分:0)
运行此代码以扩展进程堆栈大小。
对于Mac OS X和Linux:
#include <sys/resource.h>
#include <sys/types.h>
#include <sys/time.h>
...
rlimit limits;
getrlimit(RLIMIT_STACK, &limits);
limits.rlim_cur = <new process stack size (up to limits.rlim_max)>;
setrlimit(RLIMIT_STACK, &limits);
...
见Customizing Process Stack Size
和
适用于Linux的getrlimit(2) - Linux manual page和适用于Darwin的类似内容