如何设置pthread最大堆栈大小

时间:2013-03-15 14:35:52

标签: linux pthreads

API pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
是设置为创建的线程堆栈分配的最小堆栈大小(以字节为单位)。

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

感谢

3 个答案:

答案 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库设置线程的最大堆栈大小。