Какое максимальное количество потоков в Windows Server 2003? - PullRequest
29 голосов
/ 27 января 2009

Кто-нибудь знает? И еще больший вопрос: что происходит, когда вы сталкиваетесь с этим максимумом? Это тот же самый номер с другими операционными системами Windows, такими как Vista, XP и т. Д.?

Ответы [ 8 ]

35 голосов
/ 27 января 2009

Сначала я бы посоветовал прочитать это: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

, затем http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

Подводя итог, обычно ограничением является пространство стека (которое должно быть в смежных блоках), и поскольку каждый поток потребляет это, разбросанное вокруг вас, быстро заканчиваются смежные блоки. На 64-битных машинах и операционных системах это гораздо меньше проблем.

Стратегии смягчения существуют, но они зайдут так далеко (и полагаются на то, что вы не используете много стеков на поток)

В качестве приблизительного ориентира:

  • создание десятков почти наверняка сработает
  • сотни вероятны на текущем оборудовании сервера и настольного компьютера, но рискованно
  • тысячи почти наверняка потерпят неудачу.

Вероятно, вам все равно не нужно создавать более десяти (и если вам действительно нужно , вам нужно знать эту информацию уже)

26 голосов
/ 27 января 2009

Лучший ответ, который я слышал, задавая такие вопросы:

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

15 голосов
/ 27 января 2009

Обратите внимание, что вам следует внимательно изучить свой дизайн, если вы обеспокоены нарушением этого предела !!!!!!!!

Ответ на ваш «более важный вопрос» о том, что происходит, - OutOfMemoryException.

Не совсем прямой ответ, но вот код, чтобы узнать предел. Это может быть доступно в зависимости от памяти, хотя. Было бы интересно посмотреть другие результаты OS / cpu / mem.

Не стесняйтесь редактировать и добавлять свой компьютер в:

  • Windows 7, VS2008, двухъядерный, 2 Гб памяти: 1465, затем сбой с OutOfMemoryException

        int i = 0;
        try
        {
            while (true)
            {
                new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start();
                i++;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(i);
            Console.WriteLine(ex.ToString());
        }
    
2 голосов
/ 27 января 2009

Прочитайте сообщения в блоге Рэймонда Чена, на которые указал ответ ShuggyCoUk .

Но обратите особое внимание на этот бит:

Но реальный вопрос, который возникает, когда кто-то спрашивает: «Какое максимальное количество потоков может создать процесс?» такое «Почему вы создаете так много потоков, что это даже становится проблемой?»

Хорошо известно, что модель «один поток на клиента» не масштабируется более чем на дюжине клиентов. Если вы собираетесь обрабатывать больше, чем столько клиентов одновременно, вам следует перейти к модели, в которой вместо того, чтобы выделять поток для клиента, вы вместо этого выделяете объект. (Однажды я расскажу о двойственности между потоками и объектами.) Windows предоставляет порты завершения ввода-вывода и пул потоков, чтобы помочь вам преобразовать модель на основе потоков в модель на основе рабочих элементов.

1 голос
/ 24 августа 2011

Если вы застряли в существующем проекте, который использует большое количество потоков и нуждается в масштабировании, вы также можете рассмотреть волокна:

http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx

Это может сэкономить вам полный редизайн.

Indy рассматривал это для Indy 10, но этого не произошло, потому что приключения .NET занимали большую часть времени, как кажется.

1 голос
/ 27 января 2009

Насколько я понимаю, вся модель многопоточности не сильно изменилась со времен Win2K.

Нет реального ограничения потоков как такового, но есть больше ограничений стекового пространства процессов. См. Подробное объяснение пределов *1004* от Raymond Chen .

0 голосов
/ 10 марта 2017

Размер стека по умолчанию составляет 1 МБ, а адресное пространство пользовательского режима, назначенное процессу Windows под 32-битной ОС Windows, составляет около 2 ГБ. которые позволяют около 2000 потоков на процесс (2000 * 1 МБ = 2 ГБ). для 64-битной практически такой проблемы нет.

0 голосов
/ 18 августа 2015

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

Эта статья о расширении границ Windows: процессы и потоки

http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...