如何设置pthread max stacksize

api pthread_attr_setstacksize(pthread_attr_t * attr,size_t stacksize)

是为创build的线程堆栈设置分配的最小堆栈大小(以字节为单位)。

但是如何设置最大堆栈大小呢?

谢谢

Solutions Collecting From Web of "如何设置pthread max stacksize"

如果您使用pthread_attr_setstack自己管理堆栈的内存分配,则可以精确地设置堆栈大小。 所以在这种情况下,最小值和最大值一样。 例如,下面的代码说明了程序试图访问比分配给堆栈更多的内存的情况,并因此导致程序段错误。

 #include <pthread.h> #define PAGE_SIZE 4096 #define STK_SIZE (10 * PAGE_SIZE) void *stack; pthread_t thread; pthread_attr_t attr; void *dowork(void *arg) { int data[2*STK_SIZE]; int i = 0; for(i = 0; i < 2*STK_SIZE; i++) { data[i] = i; } } int main(int argc, char **argv) { //pthread_attr_t *attr_ptr = &attr; posix_memalign(&stack,PAGE_SIZE,STK_SIZE); pthread_attr_init(&attr); pthread_attr_setstack(&attr,&stack,STK_SIZE); pthread_create(&thread,&attr,dowork,NULL); pthread_exit(0); } 

如果你依靠自动分配的内存,那么你可以指定一个最小值,但不是最大值。 但是,如果您的线程的堆栈使用超过您指定的数量,那么您的程序可能会出现段错误。

请注意, pthread_attr_setstacksize的手册页说:

A thread's stack size is fixed at the time of thread creation. Only the main thread can dynamically grow its stack.

要看这个程序的一个例子,请尝试看看这个链接

你可以尝试一下他们提供的代码段,看看如果你没有分配足够的堆栈空间,那么你的程序可能会出现段错误。

在pthreads()的大部分实现中,每个线程的默认堆栈大小通常非常大。 如果遇到需要大于默认值的问题,可以尝试使用pthread_attr_stacksize()来增加它,同时检查返回值,并尝试查找更大的值。 实际限制可能基于您的特定系统上的每个进程地址空间限制。

如果您只想找出默认堆栈大小,您可以使用pthread_attr_getstacksize()。 除非您在创建线程之前亲自调整它,否则它不会变得更大。

用pthreads调整堆栈大小的一些代码在这里显示https://stackoverflow.com/a/15356607/2159730

注意:链接中的示例是为了尽量减少堆栈使用,并找到最小(这是危险的,没有太多的测试)。 与你想要做的事情相反,但这个例子可能对你有帮助。 只是采取不同的方式。

一般来说,您可能不需要将pthread堆栈大小提高到默认值以上。 如果你发现你做了,你可能应该试着明白为什么会这样。 这很不寻常。

如果你能解释你自己的代码中发生了什么,而不是一个普遍的问题,那么其他的解决方案可能会出现。 我想知道你是否真的试图减少每个线程的堆栈大小,而不是清楚地解释自己。 如果是这样的话,这个链接也可能有帮助。

我不认为有这样的选择。

如果引用<pthread.h> ,请查找常量PTHREAD_STACK_MIN常量。 这是默认情况下所有新创建线程的预定义堆栈大小。

pthread_attr_setstacksize的行为可以在这里找到:

 The pthread_attr_setstacksize() function will fail if: [EINVAL] The value of stacksize is less than PTHREAD_STACK_MIN or exceeds a system-imposed limit. 

所以,为了准确回答你的问题,你不能使用POSIX库来设置线程的最大堆栈大小。