【发布时间】:2011-05-04 13:24:53
【问题描述】:
Windows Internal book 5th edition 在第 360 页有以下评论。
初始线程的堆栈大小取自图像——没有办法 指定另一个尺寸。据我了解,对于 Windows 操作系统,每个线程被赋予 4K 或 16K(取决于系统)堆栈,并且大小是固定的。
那么 .NET 中的堆栈呢?
- 堆栈有多大?
- 堆栈的大小是固定的还是可变的?
- 是否像 Windows 一样为每个线程分配堆栈?
【问题讨论】:
Windows Internal book 5th edition 在第 360 页有以下评论。
初始线程的堆栈大小取自图像——没有办法 指定另一个尺寸。据我了解,对于 Windows 操作系统,每个线程被赋予 4K 或 16K(取决于系统)堆栈,并且大小是固定的。
那么 .NET 中的堆栈呢?
【问题讨论】:
是的,启动线程的大小由 .EXE 文件头中的值确定。必然如此,创建线程的是操作系统,在程序中的任何代码都可以运行之前。它调用程序的入口点,CorExeMain()。
您使用的托管编译器将该值写入 EXE 文件头。当前的 .NET 编译器在以 x86 或 Any CPU 为目标时选择 1 MB,在以 x64 为目标时选择 4 MB。但是,这不是固定的,您可以使用 Editbin.exe 实用程序 /STACK 命令行选项修改该值。您可以使用此构建后事件来获取 2MB 堆栈:
set path=%path%;$(DevEnvDir);$(DevEnvDir)..\..\vc\bin
editbin.exe /STACK:2097152 "$(TargetPath)"
您自己创建的线程的堆栈大小在您的控制之下,Thread 类构造函数has overloads 允许您指定大小。如果将值裁剪为 256 KB,则不能使其太小。这是必要的,即时编译器也使用堆栈。
【讨论】:
这是关于该主题的similar discussion。
问题
文档表明线程“默认堆栈大小”为 1MB。 作品“默认”意味着可以更改。
是否可以在 .NET 中更改 StackSize?如果有怎么办?
回答
很遗憾,没有。您正在阅读的文档是针对 在系统中创建新线程,由 Thread 类处理。 CreateThread API 函数允许您设置堆栈大小,您可以 从.NET 调用它。但是,我不知道这是否是一个好主意,因为我是 不确定运行时将如何感知该线程。
这是使用 CreateThread API 创建线程的代码示例
【讨论】: