Да, есть ограничения ресурсов на потоки, которые определяются операционной системы и аппаратного обеспечения.
Maximum number of threads per process in Linux?
Вы никогда не строить массово параллельный сервер, использующий поток для каждого соединения. Используйте select() или poll() и неблокирующие сокеты. Если вам нужно иметь более одного потока, работающего на входе (это действительно требует многого, прежде чем вы не сможете сделать это в одном процессе, и вы не должны делать блокирующие вызовы независимо), затем создайте рабочий пул, размер которого будет равен числу процессорные ядра, которые у вас есть, и использовать их для обработки, когда они становятся доступными.
Подробнее о концепции рабочего пула. Один поток может обрабатывать считывание всех входящих сетевых данных из сети и подбрасывать их где-то. Тем не менее, есть еще одна дополнительная работа по обработке этих данных. Для простого приложения типа сервера чата, независимо от того, сколько подключений, один поток, вероятно, может отвечать за чтение данных и обработку данных.
Однако, если вам нужно сделать что-то вроде кучи физических вычислений на каждом куске полученных данных, один поток, возможно, не сможет обрабатывать всю эту математику и оставаться в курсе входящих сетевых данных. В этом случае один поток берет данные из сети и помещает их в синхронизированную очередь обрабатываемых данных. Затем имейте несколько или два рабочих потока, берущих данные из очереди и обрабатывая их поточно-безопасным способом.
Если вы попытаетесь сделать это с помощью тысяч потоков, вы будете замедляться. Все они будут бороться за системные ресурсы, и вы на самом деле будете действовать медленнее из-за того, что ни один из них не получает циклы процессора или RAM или процессорный кеш, которые они хотят.
http://en.wikipedia.org/wiki/Thread_pool_pattern
Я не знаю, какой фиксированный предел числа номеров, которые вы предлагаете (системные ресурсы будут налагать предел, но его неположительный - точно 1000). Тем не менее, если вы хотите эффективно поддерживать очень большое количество параллельных подключений, вам следует использовать меньшее количество потоков, каждый из которых использует 'select' для ожидания любого из нескольких сокетов. – simonc
То, что вы имели в виду, похоже на то, что в каждом потоке создайте int connfd [n]. а затем для i в (1, n): connfd [i] = accept(). и затем выберите (connfd [n])? есть ли исходные коды? благодаря! – user1944267
Старая страница [C10K] (http://www.kegel.com/c10k.html), которую я связал, имеет обсуждение стратегий и фреймворков ввода-вывода. – Useless