Максимальный размер стопки нити ниже 256 КБ - PullRequest
0 голосов
/ 09 октября 2018

Возможно ли в C #, работающем на сервере Windows, создать поток с максимальным размером стека, меньшим 256 КБ?- Или как там по умолчанию для 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);
}

1 Ответ

0 голосов
/ 09 октября 2018

Взгляните на Документы по размеру стека потоков на сайте Microsoft.com .

В частности, размер стека по умолчанию устанавливается в заголовке PE (заголовок файла EXE).Возможно, вы могли бы найти способ P / Invoke соответствующих вызовов для создания собственных потоков, которые могли бы манипулировать размером стека, но я не знаю, как вы прикрепите объект .NET Thread к такому собственному потоку.

Я даже не могу представить, что вы могли бы сделать это для потока пула потоков.

Вы можете поискать чужую библиотеку потоков.Там может быть что-то, что соответствует вашим потребностям.Я знаю, что успешно использовал сторонние библиотеки пулов потоков (но я не помню каких-либо функций «принеси свой поток»).

...