Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么默认堆栈大小为0_C_Pthreads - Fatal编程技术网

C 为什么默认堆栈大小为0

C 为什么默认堆栈大小为0,c,pthreads,C,Pthreads,我从中读取pthreads,它说 默认线程堆栈大小变化很大。可以使用的最大大小 获得的数据也有很大差异,可能取决于数据的数量 每个节点的线程数。过去和现在的体系结构都显示为 演示默认线程堆栈大小的广泛变化 然后,它列出了几个处理器的一些默认值,但对于任何处理器,它都不会说0。所以我复制粘贴了它的C程序并执行了。有关部分包括: size_t stacksize; pthread_attr_init(&attr); pthread_attr_getstacksiz

我从中读取pthreads,它说

默认线程堆栈大小变化很大。可以使用的最大大小 获得的数据也有很大差异,可能取决于数据的数量 每个节点的线程数。过去和现在的体系结构都显示为 演示默认线程堆栈大小的广泛变化

然后,它列出了几个处理器的一些默认值,但对于任何处理器,它都不会说0。所以我复制粘贴了它的C程序并执行了。有关部分包括:

   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
设置一个有效值。