API pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
是设置为创建的线程堆栈分配的最小堆栈大小(以字节为单位)。
但是如何设置最大堆栈大小?
感谢
答案 0 :(得分:9)
如果使用pthread_attr_setstack
自行管理堆栈的内存分配,则可以精确设置堆栈大小。所以在这种情况下,min与max相同。例如,下面的代码说明了程序试图访问的内存多于为堆栈分配的内存,从而导致程序段错误。
#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.
要查看此计划的示例,请尝试查看this link
您可以尝试使用它们提供的代码段,并查看如果您没有分配足够的堆栈空间,则可能会导致程序出现段错误。
答案 1 :(得分:1)
在大多数pthreads()实现中,每个线程的默认堆栈大小通常非常大。如果遇到需要大于默认值的问题,可以尝试使用pthread_attr_stacksize()增加它,检查返回值,并尝试查找更大的值。实际限制可能基于特定系统的每个进程地址空间限制。
如果您只想查找默认堆栈大小,可以使用pthread_attr_getstacksize()。它不会比那更大,除非你在创建线程之前通过自己调整来告诉它。
此处显示了一些使用pthreads调整堆栈大小的代码 https://stackoverflow.com/a/15356607/2159730
注意:链接中的示例是尝试最小化堆栈使用情况,并找到最小值(这很危险,没有大量测试)。与您似乎想要做的相反,但该示例可能仍然对您有所帮助。只是采用不同的方法。
通常,您可能不需要将pthread堆栈大小提高到默认值以上。如果你发现了,你可能应该尝试理解为什么会这样。这很不寻常。
如果您能解释自己代码中实际发生的事情,而不是一般性问题,其他解决方案可能会出现。我想知道你是否真的试图减少每线程堆栈大小,而不是清楚地解释自己。如果是这种情况,链接也可能有助于此原因。
答案 2 :(得分:0)
我认为没有选择这样做。
如果您引用<pthread.h>
,请查找常量PTHREAD_STACK_MIN
常量。这是默认情况下所有新创建的线程的预定堆栈大小。
可以找到pthread_attr_setstacksize
的行为here:
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库设置线程的最大堆栈大小。