Это не имеет большого значения, какой из трех решений вы выбираете, разница не будет огромным. Существует, однако, тот, который позволит вам сохранить системные вызовы (см. В конце).
Для 4 дескрипторов вы можете предположить, что poll
в значительной степени точно так же быстро, как epoll
. Это было бы совершенно иначе для 400 или 4000 дескрипторов, но для 4 дескрипторов poll
абсолютно приемлемо (хотя вы все равно можете использовать epoll
, конечно, просто не ожидайте чуда). Важная вещь о epoll
- это то, как она масштабируется в отношении количества дескрипторов, которые она смотрит, а не столько, сколько быстро она контролирует очень немногие из них.
Опрос (с любой функцией), а затем получение - это, очевидно, еще один системный столбец, чем прием непосредственно в потоке, хотя в зависимости от характера вашей проблемы это может быть слишком наивным способом взглянуть на него.
Если дейтаграммы из этих 4 многоадресных адресов могут обрабатываться независимо, вы можете просто запустить один процесс на порт и заблокировать по recv
(самое простое решение!), Но в противном случае вам нужна какая-то синхронизация, которая может быть сложной, чтобы получить право если вы этого еще не сделали, и который может (будет) включать дополнительные системные вызовы или вращение и может быть, возможно, медленнее, чем получение мультиплексирования.
Количество переключателей контекста будет примерно соответствовать количеству системных вызовов, независимо от того, есть ли у вас потоки или нет (поскольку вы все равно блокируете в большинстве системных вызовов), если у вас нет очень занятой машины с очень небольшим количеством запасных ядер. В этом случае бросание потоков в игру будет значительно увеличить количество переключателей контекста.
Multicast предполагает UDP, что означает «полные датаграммы». Поскольку вы рассматриваете использование epoll
, вы решили, что переносимость не является проблемой. Поэтому вы можете использовать другой системный вызов, специфичный для Linux: recvmmsg
. Это позволяет получать несколько дейтаграмм только с одним системным вызовом. Если бы у вас был только один сокет, вы бы просто заблокировали его, так как он предлагает функциональность «получать до n». Однако, поскольку вам все еще нужно мультиплексировать 4 гнезда, вы сначала будете использовать epoll
, а затем recvmmsg
.
Лучше, каким образом? –
, если вы знаете, что никогда не будете когда-либо обрабатывать какой-либо другой поток, чем 4, пойдите с 4 потоками, которые должны быть достаточными и намного более легкими в реализации. Однако, если вам нужно будет масштабировать, то перейдите с epoll. –
Возможный дубликат [В чем разница между epoll, poll, threadpool?] (Http://stackoverflow.com/questions/4093185/whats-the-difference-between-epoll-poll-threadpool) – deW1