Как говорит Гэри, порты завершения ввода / вывода являются наиболее эффективным способом управления несколькими сетевыми подключениями неблокирующим / асинхронным способом на платформах Windows.
С IOCP вы получаете уведомление о завершении сетевых операцийи вы можете обработать эти завершения с небольшим количеством потоков.Вы сами решаете, сколько потоков выделите для обработки завершений, а ядро решает, когда использовать потоки, которые вы предоставляете.Он использует их в порядке LIFO, чтобы уменьшить переключение контекста, так что если вы используете только минимальное количество потоков, необходимое в любой точке, и вы повторно используете те же потоки, а не циклически перебираете все потоки, которые у вас есть дляuse.
Асинхронный характер программирования IOCP может показаться немного запутанным, но как только вы его освоите, он довольно прост.
У меня есть бесплатный серверный код IOCP, которыйдемонстрирует основы и предоставляет несколько примеров серверов, на которых довольно легко построить.Вы можете найти код здесь: http://www.serverframework.com/products---the-free-framework.html. Эта страница также ссылается на некоторые статьи, которые я написал, чтобы объяснить код.
Связав это с деталями вашего вопроса.Вы должны смотреть на вариант вашего третьего подхода.Используйте AcceptEx () для принятия новых соединений, это можно использовать асинхронно, поэтому вам не нужен отдельный поток для принятия соединения, и вы можете использовать потоки, которые также обрабатывают ваше перекрытое / асинхронное чтениеи операции записи.