Подтвердить что ты не робот

Какое максимальное количество потоков в Windows Server 2003?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ на ваш "Более важный вопрос" о том, что происходит, это OutOfMemoryException.

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

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

  • Windows 7, VS2008, двухъядерный, 2gb mem: 1,465, затем сбой 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());
        }
    

Ответ 4

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

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

Ответ 5

Прочитайте записи блога Raymond Chen, на которые указывает ответ ShuggyCoUk.

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

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

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

Ответ 6

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

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

Это может сэкономить вам общую редизайн.

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

Ответ 7

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

Ответ 9

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