pthread 的堆栈大小不受限制

pthread 的堆栈大小不受限制

我的默认堆栈大小(根据 ulimit -s)是 8192 kB,因此当我尝试运行下面的代码时,它自然会出现段错误。另外,自然地,如果我执行“ulimit -s 9000”,它就可以正常工作。但是,当我执行“ulimit -s unlimited”时,代码再次出现段错误。有什么想法吗?

如果它有用,我正在运行内核为 4.19.0-6 的 Debian 10 和 gcc 版本为 Debian 8.3.0-6。

#include <iostream>
#include <unistd.h>
#include <cstdlib>

void* wait_exit(void*)
{
  char bob[8193*1024];
  return 0;
}

int main()
{
  pthread_t t_exit;
  int ret;
  
  if((ret = pthread_create(&t_exit,NULL,wait_exit,NULL)) !=0)
  {
    std::cout<<"Cannot create exit thread: "<<ret<<std::endl;
  }
  std::cout<<"Made thread"<<std::endl;
  sleep(5);
  return 0;
}

答案1

因为对于“无限制”线程,在 x86_64 上仅提供 2 MiB,请参阅pthread_create 手册页:

If the RLIMIT_STACK resource limit is set to "unlimited", a per-architecture value is used 
for the stack size.  Here is the value for a few architectures:

              ┌─────────────┬────────────────────┐
              │Architecture │ Default stack size │
              ├─────────────┼────────────────────┤
              │i386         │               2 MB │
              ├─────────────┼────────────────────┤
              │IA-64        │              32 MB │
              ├─────────────┼────────────────────┤
              │PowerPC      │               4 MB │
              ├─────────────┼────────────────────┤
              │S/390        │               2 MB │
              ├─────────────┼────────────────────┤
              │Sparc-32     │               2 MB │
              ├─────────────┼────────────────────┤
              │Sparc-64     │               4 MB │
              ├─────────────┼────────────────────┤
              │x86_64       │               2 MB │
              └─────────────┴────────────────────┘

相关内容