«Максимальное количество потоков» - не столь полезная метрика, как вы могли бы подумать:
Обычно для всей системы установлено максимальное количество потоков, налагаемое любой операционной системой.или доступные аппаратные ресурсы.
Максимальное количество потоков для каждого процесса часто настраивается и может даже меняться на лету.
В большинстве случаев фактическое ограничение исходит от ваших аппаратных ресурсов, а не от каких-либо ограничений.Так же, как и любой другой ресурс (например, память), вы должны проверять, были ли вы успешны, а не полагаться на какое-то ограничение.
В общем случае многопоточность имеет только два преимущества, когдапо сравнению с циклами событий:
Может использоваться более одного процессора.В зависимости от операционной системы вы также можете использовать для этого несколько процессов (а не более легкие потоки).
В зависимости от операционной системы, это может обеспечить некоторую степень разделения привилегий.
Кроме того, многопоточность обычно дороже как в памяти, так и в ресурсах обработки.Большое количество потоков может остановить вашу систему независимо от того, что они делают, ресурсоемкие или нет.
В большинстве случаев лучшим решением является гибрид обеих моделей, то есть несколько потоков сцикл обработки событий в каждом из них.
РЕДАКТИРОВАТЬ:
В современных системах Linux файл /proc/sys/kernel/threads-max
предоставляет общесистемное ограничение на количество потоков.Пользователь root может изменить это значение, если он хочет:
echo 100000 > /proc/sys/kernel/threads-max
Насколько я знаю, ядро специально не накладывает ограничение на количество процессов для каждого процесса.
sysconf()
может использоваться для запроса системных ограничений.В /usr/include/bits/confname.h
(переменные _SC_THREAD*
) определены некоторые частично документированные переменные запроса, связанные с потоками.
getrlimit()
можно использовать для запроса пределов сеанса - вв этом случае ресурс RLIMIT_NPROC
связан с потоками.
Реализация потоков в glibc
может также накладывать свои собственные ограничения для каждого процесса.
Имейте в виду, что в зависимости отв конфигурации вашего оборудования и программного обеспечения ни одно из этих ограничений не может быть использовано.В Linux основным ограничивающим фактором для количества потоков является тот факт, что каждому потоку требуется память в стеке - если вы начнете запускать потоки, вы можете легко достичь этого предела раньше, чем другие.
Если вы действительно хотитечтобы найти действительный лимит, тогда единственный способ - запускать потоки, пока вы не сможете больше этого делать.Даже это даст вам приблизительный предел, действительный только на момент запуска программы .Это может легко измениться, если, например, ваши потоки начнут выполнять реальную работу и увеличат использование ресурсов.
По моему мнению, если вы запускаете более 3-4 потоков на процессор , вам следует пересмотреть свои дизайн .