阅读this和this后,我运行了一个非常简单的C#程序,如下所示:
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(myFunc), 2097152);
t.start();
}
Thread
类构造函数的第二个参数是要为线程分配的堆栈的大小(以字节为单位)。数字2097152相当于2兆字节。但我的程序仍然没有任何错误?如果我的程序在为此线程分配堆栈空间(对于完整应用程序本身限制为1 MB)时不会抛出错误,或者我错过了一些非常明显的错误。最初我认为这可能是编译器检查本身。
CLR如何确保线程的堆栈分配大小,以便它不会破坏边界?
P.S。 :我的应用程序是32位控制台应用程序
答案 0 :(得分:3)
1MB只是默认堆栈大小每个线程,而不是整个应用程序。每个线程都有自己的堆栈。在线程构造函数中指定不同的堆栈大小时,将覆盖该线程的默认值。
如果要测试堆栈大小的限制,则需要调用递归函数,直到堆栈填满并溢出(因此该网站的名称)。简单地创建更多线程只会创建更多堆栈。
答案 1 :(得分:2)
As per Microsoft documentation,
"从.NET Framework 4开始,只有完全受信任的代码才能将maxStackSize设置为大于默认堆栈大小(1兆字节)的值。如果在使用部分信任运行代码时为maxStackSize指定了更大的值,则忽略maxStackSize并使用默认堆栈大小。 不会抛出异常。任何信任级别的代码都可以将maxStackSize设置为小于默认堆栈大小的值。"