【问题标题】:The .NET stack vs Windows stack.NET 堆栈与 Windows 堆栈
【发布时间】:2011-05-04 13:24:53
【问题描述】:

Windows Internal book 5th edition 在第 360 页有以下评论。

初始线程的堆栈大小取自图像——没有办法 指定另一个尺寸。

据我了解,对于 Windows 操作系统,每个线程被赋予 4K 或 16K(取决于系统)堆栈,并且大小是固定的。

那么 .NET 中的堆栈呢?

  • 堆栈有多大?
  • 堆栈的大小是固定的还是可变的?
  • 是否像 Windows 一样为每个线程分配堆栈?

【问题讨论】:

标签: .net stack


【解决方案1】:

是的,启动线程的大小由 .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,则不能使其太小。这是必要的,即时编译器也使用堆栈。

【讨论】:

    【解决方案2】:

    这是关于该主题的similar discussion。

    问题

    文档表明线程“默认堆栈大小”为 1MB。 作品“默认”意味着可以更改。

    是否可以在 .NET 中更改 StackSize?如果有怎么办?

    回答

    很遗憾,没有。您正在阅读的文档是针对 在系统中创建新线程,由 Thread 类处理。 CreateThread API 函数允许您设置堆栈大小,您可以 从.NET 调用它。但是,我不知道这是否是一个好主意,因为我是 不确定运行时将如何感知该线程。

    这是使用 CreateThread API 创建线程的代码示例

    http://www.codeproject.com/KB/threads/Threads_1.aspx

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 2010-12-06
      • 2010-10-03
      • 2012-01-18
      • 2021-02-18
      • 1970-01-01
      • 2013-10-13
      • 2012-10-12
      • 2011-10-06
      相关资源
      最近更新 更多