LINUX.ORG.RU

многопоточный recvfrom


0

1

Есть сокет (в блокирующем режиме) ожидающий коннект на определенный порт, и есть проц 4-х ядерный. Что если запустить на каждое ядро по 1 потоку и в этих потоке делать recvfrom для этого сокета. И вот главный вопрос: Будет ли в этом случае прирост производительности? И вообще можно ли такое делать? Как я понимаю если пришло сообщение то допустим в первом потоке обрабатываются данные полученные через recvfrom, в это время если пришли данные, то другой поток будет обрабатывать их. Так?


Прирост производительности - только если у вас 100 Gbit-ная сеть, при которой 1 ядро физически не успевает читать:) Можно ли так делать - it depends ;) по хорошему так не стоит никогда делать, заведите 1 поток на чтение, который будет складывать данные в общую очередь, откуда потоки-обработчики, по мере освобождения, будут данные доставать и процессировать.

hydraulicbrakefluid
()

Вообще, чтобы получить оптимум производительности, рекомендуется делить thread сетевого кода и thread'ы обработчиков. Сетевой thread делает select() с коротким таймаутом (например, 50мс) и потом для всех сокетов, отмеченных как «имеющие данные для чтения», делается recvfrom (они не блокируются, поскольку данные есть). Полученные данные бросаются в очередь, откуда их впоследствии извлекают и обрабатывают thread'ы-обработчики.

Nastishka ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.