CLR 强制执行的 1 MB 堆栈大小限制是针对线程还是整个 application/process?
1 MB stack size limit enforced by the CLR is for a thread or the entire application/process?
看完this and post我运行一个非常简单的C#程序如下所示:
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(myFunc), 2097152);
t.start();
}
Thread
class 的构造函数的第二个参数是要为线程分配的堆栈大小(以字节为单位)。数字 2097152 相当于 2 兆字节。但是我的程序仍然可以正常运行,没有任何错误吗?如果我的程序在为此线程分配堆栈 space(完整应用程序本身限制为 1 MB)时不会抛出错误,或者我遗漏了一些非常明显的东西。最初我以为这可能是编译器检查自己。
CLR 如何确保线程的堆栈分配大小,使其不会越界?
P.S。 : 我的应用程序是 32 位控制台应用程序
1MB 只是默认堆栈大小每个线程,而不是整个应用程序。每个线程都有自己的堆栈。当您在线程构造函数中指定不同的堆栈大小时,您将覆盖该线程的默认值。
如果您想测试堆栈大小的限制,您需要调用递归函数,直到堆栈填满并溢出(本网站因此得名)。简单地创建更多线程只会创建更多堆栈。
As per Microsoft documentation,
"Beginning with the .NET Framework 4, only fully trusted code can set maxStackSize to a value that is greater than the default stack size (1 megabyte). If a larger value is specified for maxStackSize when code is running with partial trust, maxStackSize is ignored and the default stack size is used. No exception is thrown. Code at any trust level can set maxStackSize to a value that is less than the default stack size."
看完this and
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(myFunc), 2097152);
t.start();
}
Thread
class 的构造函数的第二个参数是要为线程分配的堆栈大小(以字节为单位)。数字 2097152 相当于 2 兆字节。但是我的程序仍然可以正常运行,没有任何错误吗?如果我的程序在为此线程分配堆栈 space(完整应用程序本身限制为 1 MB)时不会抛出错误,或者我遗漏了一些非常明显的东西。最初我以为这可能是编译器检查自己。
CLR 如何确保线程的堆栈分配大小,使其不会越界?
P.S。 : 我的应用程序是 32 位控制台应用程序
1MB 只是默认堆栈大小每个线程,而不是整个应用程序。每个线程都有自己的堆栈。当您在线程构造函数中指定不同的堆栈大小时,您将覆盖该线程的默认值。
如果您想测试堆栈大小的限制,您需要调用递归函数,直到堆栈填满并溢出(本网站因此得名)。简单地创建更多线程只会创建更多堆栈。
As per Microsoft documentation,
"Beginning with the .NET Framework 4, only fully trusted code can set maxStackSize to a value that is greater than the default stack size (1 megabyte). If a larger value is specified for maxStackSize when code is running with partial trust, maxStackSize is ignored and the default stack size is used. No exception is thrown. Code at any trust level can set maxStackSize to a value that is less than the default stack size."