5

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

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

谢谢

4

3 回答 3

9

如果您自己管理堆栈的内存分配,则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.

要查看此程序的示例,请尝试查看此链接

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

于 2013-03-15T21:19:40.420 回答
1

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

如果您只想找出默认堆栈大小是多少,可以使用 pthread_attr_getstacksize()。它不会变得比这更大,除非您在创建线程之前通过自己调整它来告诉它。

此处显示了一些使用 pthread 调整堆栈大小的代码 https://stackoverflow.com/a/15356607/2159730

注意:链接中的示例是为了尽量减少堆栈使用,并找到最小值(这是危险的,没有进行大量测试)。有点与您似乎想要做的相反,但该示例可能仍然对您有所帮助。只是以不同的方式处理它。

通常,您可能不需要将 pthread 堆栈大小提高到默认值以上。如果你发现你这样做了,你可能应该试着理解为什么会这样。这是相当不寻常的。

如果您可以解释自己代码中实际发生的情况,而不是一般性问题,其他解决方案可能会出现。我想知道您是否真的在尝试减少每个线程堆栈的大小,而只是没有清楚地解释自己。如果是这种情况,该链接也可能因此而有所帮助。

于 2013-03-15T21:37:59.263 回答
0

我不认为有这样做的选择。

如果您参考<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 库设置线程的最大堆栈大小。

于 2013-03-15T14:52:26.207 回答