我的默认堆栈大小(根据 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 │
└─────────────┴────────────────────┘