关于C#:为什么默认堆栈大小为0 | 珊瑚贝

why is default stack size 0


我正在阅读来自 https://computing.llnl.gov/tutorials/pthreads/ 的 pthreads,它说

Default thread stack size varies greatly. The maximum size that can be
obtained also varies greatly, and may depend upon the number of
threads per node. Both past and present architectures are shown to
demonstrate the wide variation in default thread stack size.

然后它列出了几个处理器的一些默认值,但它从不为任何处理器显示 0。所以我复制粘贴了它的C程序并执行。相关部分是:

1
2
3
4
5
   size_t stacksize;    
   pthread_attr_init(&attr);
   pthread_attr_getstacksize (&attr, &stacksize);
   printf(“Default stack size = %li\
, stacksize);

我得到了输出:

1
Default stack size = 0

为什么是0?

  • 我怀疑这种行为实际上是不合格的。例如,如果出现以下情况,pthread_attr_setstacksize() 函数将失败: [EINVAL] stacksize 的值小于 {PTHREAD_STACK_MIN} 或超过系统强加的限制。这对我来说意味着”0″不是该属性的有效设置。
  • @R,来自 pubs.opengroup.org/onlinepubs/7908799/xsh/limits.h.html:PTHREAD_STACK_MIN Minimum size in bytes of thread stack storage. Minimum Acceptable Value: 0。我怀疑是这种情况,因为它是 pthread_init 设置该值,而不是用户通过 pthread_setstacksize 设置的。我认为 init 会设置一个有效值以在 pthread_create 中使用。


属性中的堆栈大小是最小堆栈大小,很可能为零。我怀疑在这种情况下,使用该属性创建的任何线程都会获得合理的默认值,例如 4M。

如果你想要默认值,我们的想法是不考虑属性堆栈大小,如果你想强制它为特定最小值,请将其设置为其他值。

  • 4K 是明智的默认设置吗?那不是很小吗?
  • 嗯,这是一个例子,但你是对的:我的意思是 4M。虽然你会惊讶于你可以用 4K 的堆栈空间做什么:-) 我的 Ubuntu 11.04 盒子上的 ulimit -s 显示 8M。
  • 4k 有点小,但 Linux 内核空间使用 4k 堆栈就可以了。您需要超过 16-32k 的唯一原因是您使用大型自动缓冲区(例如 PATH_MAX 长度)或处理许多嵌套调用帧(例如递归)。


来源:https://www.codenong.com/9340222/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?