C 为什么默认堆栈大小为0
我从中读取pthreads,它说 默认线程堆栈大小变化很大。可以使用的最大大小 获得的数据也有很大差异,可能取决于数据的数量 每个节点的线程数。过去和现在的体系结构都显示为 演示默认线程堆栈大小的广泛变化 然后,它列出了几个处理器的一些默认值,但对于任何处理器,它都不会说0。所以我复制粘贴了它的C程序并执行了。有关部分包括:C 为什么默认堆栈大小为0,c,pthreads,C,Pthreads,我从中读取pthreads,它说 默认线程堆栈大小变化很大。可以使用的最大大小 获得的数据也有很大差异,可能取决于数据的数量 每个节点的线程数。过去和现在的体系结构都显示为 演示默认线程堆栈大小的广泛变化 然后,它列出了几个处理器的一些默认值,但对于任何处理器,它都不会说0。所以我复制粘贴了它的C程序并执行了。有关部分包括: size_t stacksize; pthread_attr_init(&attr); pthread_attr_getstacksiz
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize (&attr, &stacksize);
printf("Default stack size = %li\n", stacksize);
我得到输出:
Default stack size = 0
为什么为0?属性中的堆栈大小是最小堆栈大小,很可能为零。我怀疑在这种情况下,使用该属性创建的任何线程都会得到一个合理的默认值,例如4M
如果需要默认值,可以不使用属性堆栈大小,如果要强制将其设置为特定的最小值,可以将其设置为其他值。4K是合理的默认值?这不是很小吗?嗯,这是一个例子,但你是对的:我的意思是4米。虽然你会对4K堆栈空间的使用感到惊讶:-)
ulimit-s
在我的Ubuntu11.04上显示8M.4K有点小,但Linux内核空间可以使用4K堆栈。您需要超过16-32k的唯一原因是如果您使用大型自动缓冲区(例如PATH\u MAX
length)或处理许多嵌套调用帧(例如递归)。我怀疑这种行为实际上是不一致的。例如,如果:[EINVAL]stacksize的值小于{pthread_STACK_MIN}或超过系统施加的限制,pthread_attr_setstacksize()函数将失败。这对我来说意味着“0”不是该属性的有效设置。@R,from:PTHREAD\u STACK\u最小线程堆栈存储字节数。最小可接受值:0
。我怀疑这里就是这种情况,因为是pthread\u init
设置了该值,而不是用户通过pthread\u setstacksize
设置的。我认为init
会为pthread\u create
设置一个有效值。