Существует большой обзор всех различных вариантов выполнения операций ввода-вывода большого объема, которые называются Проблема C10K . В нем достаточно полный обзор множества различных вариантов, по крайней мере, по состоянию на 2006 год.
Цитирование из него, на тему использования select
на неблокирующих сокетах:
Примечание: особенно важно помнить, что уведомление о готовности от ядра - только подсказка; дескриптор файла может быть не готов, когда вы пытаетесь читать с него. Вот почему важно использовать неблокирующий режим при использовании уведомления о готовности.
И да, вы можете использовать неблокирующие сокеты, а затем иметь цикл, который ждет, если ничего не готово, но это довольно расточительно по сравнению с использованием чего-то вроде select
или одной из более современных замен (epoll
, kqueue
и т. Д.). Я не могу придумать причину, по которой кто-то на самом деле хотел бы сделать это; все опции типа select
имеют возможность установить тайм-аут, так что вы можете проснуться через определенное время, чтобы выполнить какое-то регулярное действие. Я полагаю, что если вы выполняете что-то достаточно интенсивное использование процессора, например, запускаете видеоигру, вы, возможно, захотите никогда не спать, а вместо этого продолжать вычисления, периодически проверяя ввод / вывод с использованием неблокирующих сокетов.