繁体   English   中英

将线程最大堆栈大小降低到 256KB 以下

[英]Lowering Thread Max Stack Size Below 256KB

是否可以在 Windows 服务器上运行的 C# 中创建最大堆栈大小低于 256KB 的线程? -- 或者 IIS 的默认设置; 或者更具体地说,一个Azure 网站

我编写的这个控制台程序似乎表明通过 .NET Thread构造函数是不可能的,而且我还没有在网上找到任何信息表明它可以通过 P-Invoke 或任何其他机制实现。

这是我的 Windows 10 桌面上的程序输出:

默认最大堆栈大小(以字节为单位):1,048,576
预期的最大堆栈大小(以字节为单位):64,000; 实际:262,144
预期的最大堆栈大小(以字节为单位):128,000; 实际:262,144
预期的最大堆栈大小(以字节为单位):512,000; 实际:524,288
预期的最大堆栈大小(以字节为单位):2,048,000; 实际:2,097,152
预期的最大堆栈大小(以字节为单位):1,024,000; 实际:1,048,576

internal class Program
{
  public static void Main()
  {
    var threads = new[]
    {
      CreateControlThread(),
      CreateThread(64_000),
      CreateThread(128_000),
      CreateThread(512_000),
      CreateThread(1_024_000),
      CreateThread(2_048_000)
    };

    foreach (var thread in threads) thread.Start();
    foreach (var thread in threads) thread.Join();

    Console.ReadKey();
  }

  private Thread CreateControlThread()
     => new Thread(() => WriteMaximumStackSize(0));

  private static Thread CreateThread(int maximumStackSizeInBytes)
     => new Thread(() => WriteMaximumStackSize(maximumStackSizeInBytes), maximumStackSizeInBytes);

  private static void WriteMaximumStackSize(int expected)
  {
    GetCurrentThreadStackLimits(out uint low, out uint high);

    if (expected > 0)
    {
      Console.WriteLine("Expected maximum stack size in bytes: " + expected.ToString("n0") + "; Actual: " + (high - low).ToString("n0"));
    }
    else
    {
      Console.WriteLine("Default maximum stack size in bytes: " + (high - low).ToString("n0"));
    }
  }

  [DllImport("kernel32.dll")]
  private static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);
}

查看Microsoft.com上的线程堆栈大小文档

特别是,默认堆栈大小是在 PE Header(EXE 文件的头)中设置的。 您可能会找到一种方法来 P/Invoke 对可以操纵堆栈大小的本机线程创建调用的适当调用,但我不知道您如何将 .NET Thread 对象附加到这样的本机线程。

我什至无法想象您可以为线程池线程执行此操作。

您可能会四处寻找其他人的线程库。 可能有一些适合您的需求。 我知道我已经成功地使用了第三方线程池库(但我不记得任何“自带线程”功能)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM