Linux сокеты и многопоточность в C - PullRequest
4 голосов
/ 07 января 2010

Я хочу создать процесс, работающий под Linux, который создает несколько потоков, каждый поток записывает свои данные в принимающий процесс через соединение через сокет UDP. Для определения размера, скажем, мне нужно, чтобы до ста этих потоков работали одновременно, а потоки приходили и уходили.

Лучше ли каждому потоку открывать свой собственный сокет для одного и того же места назначения, используя один и тот же номер порта UDP, когда создается поток (таким образом, требуется 100 отдельных файловых дескрипторов), или открывать сокет один раз в основном потоке передать этот файловый дескриптор каждому из потоков, чтобы каждый из них использовал один и тот же сокет? Каждый поток будет генерировать около 20 пакетов в секунду, каждый пакет длиной примерно 800 байт. Синхронизация между потоками отсутствует.

Ответы [ 4 ]

1 голос
/ 07 января 2010

Я не думаю, что было бы выигрыш в скорости при использовании нескольких розеток, если это возможно на многосетевой машине. Уровень физической сети не может одновременно отправлять два пакета. Я был бы немного обеспокоен, однако, об использовании одного сокета без синхронизации. Я думаю предполагается, что он поточно-ориентирован, но некоторые поиски в Google, кажется, указывают на потенциальные проблемы. Я бы, вероятно, поставил бы синхронизацию вокруг него, если бы кодировал его, потому что основное размещение пакета на проводе в конечном итоге будет сериализовано.

0 голосов
/ 07 января 2010

ваше решение работает правильно, потому что у вас нет одинаковых данных для обмена между потоками. Но я думаю, что вы можете использовать пул соединений (установить некоторое соединение и заимствовать потоки), и потоки в очереди ожидают соединения с пулом. Если число соединений и потоков слишком велико, производительность теряется [сетевое ограничение и ограничение вашей машины] другое решение, которое все в очереди - не используйте пул и ставьте в очередь все. но я думаю, что пул дает лучшую производительность.

0 голосов
/ 07 января 2010

Я бы пошел на loose-coupling подход - все потоки были бы независимыми. Нагрузка не кажется чрезмерной, поэтому ослабленное соединение представляется подходящим.

Конечно, некоторые люди не согласятся, но с системной точки зрения слабая связь всегда предпочтительнее ... где это применимо: -)

0 голосов
/ 07 января 2010

Отдельные записи сокетов синхронизируются для вас (на уровне сокетов), и, если у вас нет группирующих или относительных упорядочивающих зависимостей, это будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...