【发布时间】:2017-06-22 22:16:26
【问题描述】:
阅读this 和this 的帖子后,我运行了一个非常简单的C# 程序,如下所示:
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(myFunc), 2097152);
t.start();
}
Thread 类的构造函数的第二个参数是要为线程分配的堆栈大小(以字节为单位)。数字 2097152 相当于 2 兆字节。但是我的程序仍然可以正常工作吗?如果我的程序在为此线程分配堆栈空间(完整应用程序本身的限制为 1 MB)时不会抛出错误,或者我错过了一些非常明显的东西。最初我认为这可能是编译器检查本身。
CLR 如何确保线程的堆栈分配大小不会超出界限?
附: : 我的应用是 32 位控制台应用
【问题讨论】:
-
您在说什么“1 MB 堆栈大小限制”?线程的默认堆栈大小为 1MB,但这不是硬性限制。您传递的参数实际上是修改此默认值的方法。请更具体地说明您的要求。
-
你从哪里得到堆栈只能是 1MB 的想法?既然您正在创建一个 2MB 的堆栈,那么您认为堆栈只能是 1MB 的想法显然是错误的,那么您为什么会相信呢?
-
这是我今天在 Windows 中第一次介绍此限制。事实上,现在我意识到这不是限制,而是可以在每个线程的基础上修改的配置。this 论坛上的第一行让我进入了不同的方向 -
The default stack size for a .NET application is 1 MB (default is 256 KB for 32-bit ASP.NET apps and 512 KB for 64-bit ASP.NET apps)。我提到的任何一个帖子都没有完全使用过per-thread这个词。对于初学者来说,理解起来可能不是那么简单。 -
谢谢;理解为什么人们相信关于编程语言的错误信息对我很有帮助。那么,你相信程序中的每个线程都从 1MB 的堆栈缓冲区中挖出自己的空间吗?那么如果有 1000 个线程,它们每个会得到 1K?
-
谢谢,这很有帮助。是的,现在你明白为什么线程非常昂贵了。一千个线程将每个保留一百万字节的地址空间。这就是为什么你永远不会制作一千个线程。您为每个 CPU 创建一个线程并将它们池化。一个线程在您使用时从池中出来,完成后又回到池中,并且您创建的线程不会超过处理它们的 CPU。
标签: c# .net memory-management stack clr