【问题标题】:How to set pthread max stack size如何设置 pthread 最大堆栈大小
【发布时间】:2018-08-23 05:13:22
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 我只想对堆栈大小发表评论:如果您尝试查找“每个线程占用了多少内存”,最终看起来您的应用程序需要一些基本内存 + 大约 8MB 每个线程,你可能可以放松。在您实际填满内存之前,内存不会实际使用/锁定。限制堆栈大小通常是个坏主意,而且在大多数情况下也不需要它,除了资源非常有限的嵌入式系统。

标签: linux pthreads


【解决方案1】:

如果您使用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.

要查看此程序的示例,请尝试查看 this link

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我认为没有办法这样做。

      如果您引用&lt;pthread.h&gt;,请查找常量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 库设置线程的最大堆栈大小。

      【讨论】:

      • 谢谢,我使用的参数堆栈大小似乎小于 MIPS 上的 PTHREAD_STACK_MIN。
      • 你说:The stack grows as needed for each thread automatically until you run out. 但是,这并不是在所有情况下都是正确的。请注意,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.
      猜你喜欢
      • 1970-01-01
      • 2015-08-08
      • 2011-11-24
      • 2016-12-07
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      相关资源
      最近更新 更多