Максимальное количество потоков в приложении .NET? - PullRequest
123 голосов
/ 28 сентября 2008

Какое максимальное количество потоков вы можете создать в приложении C #? И что происходит, когда вы достигаете этого предела? Это исключение какого-то рода?

Ответы [ 5 ]

133 голосов
/ 28 сентября 2008

Не существует собственного ограничения. Максимальное количество потоков определяется количеством доступных физических ресурсов. См. Эту статью Раймонда Чена для уточнения.

Если вам нужно спросить, какое максимальное количество потоков, вы, вероятно, делаете что-то не так.

[ Обновление : просто не представляет интереса: номера потоков по умолчанию .NET Thread Pool:

  • 1023 в Framework 4.0 (32-разрядная среда)
  • 32767 в Framework 4.0 (64-разрядная среда)
  • 250 на ядро ​​в Framework 3.5
  • 25 на ядро ​​в Framework 2.0

(Эти цифры могут отличаться в зависимости от оборудования и ОС)]

25 голосов
/ 28 сентября 2008

Митч прав. Это зависит от ресурсов (памяти).

Хотя статья Рэймонда посвящена потокам Windows, а не потокам C #, логика применяется аналогично (потоки C # отображаются на потоки Windows).

Однако, поскольку мы находимся в C #, если мы хотим быть абсолютно точными, нам нужно различать «запущенные» и «незапущенные» потоки. Только запущенные потоки фактически резервируют пространство стека (как мы могли ожидать). Незапущенные потоки выделяют только информацию, требуемую для объекта потока (вы можете использовать отражатель, если заинтересованы в реальных членах).

Вы можете проверить это сами, сравните:

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                newThread.Start();
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

с:

   static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

Поставьте точку останова в исключении (конечно, нехватке памяти) в VS, чтобы увидеть значение счетчика. Разница, конечно, очень существенная.

8 голосов
/ 12 ноября 2012

Я провел тест на 64-битной системе с консолью c #, исключение составляет тип нехватки памяти, использующий 2949 потоков.

Я понимаю, что мы должны использовать пул потоков, что я и делаю, но этот ответ является ответом на главный вопрос;)

6 голосов
/ 05 июля 2009

Вы должны использовать пул потоков (или асинхронные delgates, которые, в свою очередь, используют пул потоков), чтобы система могла решить, сколько потоков следует запустить.

4 голосов
/ 28 сентября 2008

Джефф Рихтер в CLR через C #:

"С версией 2.0 CLR максимальное количество рабочих потоков по умолчанию 25 на процессор в машине и максимальное количество входов / выходов по умолчанию для потоков установлено значение 1000. Ограничение 1000 практически не ограничено. "

Обратите внимание, что это на основе .NET 2.0. Это может измениться в .NET 3.5.

[Edit] Как указал @Mitch, это относится к CLR ThreadPool. Если вы создаете темы, смотрите комментарии @Mitch и др.

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