Вопрос по posix, multithreading, sockets, pthreads, linux – Можно ли вызвать accept () для одного сокета из нескольких потоков одновременно?

6

Я использую Linux 3.2.0, x86_64. Можно ли вызвать accept () для одного сокета из нескольких потоков одновременно?

возможный дубликатIs accept() thread-safe? alk

Ваш Ответ

1   ответ
11

Да, вы можете позвонитьaccept() на одном и том же сокете прослушивания из нескольких потоков и нескольких процессов, хотя, возможно, не так много смысла, как вы думаете. Ядро позволит только одному добиться успеха. Когда это сделано с процессами, это известно как предварительное разветвление, и это экономит затраты наfork() за каждое новое соединение. Но когда вы имеете дело с потоками, вы можете легче иметь существующий пул потоков, который ожидает в очереди новых соединений. Одна нить делаетaccept и записывает очередь, а рабочие потоки читают очередь и делают свое дело. Это чище, это хорошо понятная схема, и вы почти ничего не теряете.

Каковы эти причины? Почему две очереди лучше, чем одна? alkedr
Ранние версииaccept будет сериализовать доступ к системному вызову, но разбудит все потоки / процессы, когда он станет доступным, что приведет кthundering herd problem, который правильно реализованная вторичная очередь решает. Я не уверен, еслиaccept все еще имеет эту проблему, хотя.
Если ты так говоришь. Просто помните, что есть причины, по которым появляются лучшие практики.
От opengroup.org функция listen (): & quot; Аргумент backlog предоставляет подсказку реализации, которую реализация должна использовать, чтобы ограничить количество ожидающих соединений в очереди прослушивания сокета. & Quot; Очередь уже существует, нам не нужна другая. alkedr
Очередь невыполненных работ носит рекомендательный характер у вас нет большого контроля, если вы не являетесь пользователем root; обычно он не очень большой, и tcp начинает отклонять соединения, когда он заполнен. Вы можете легче управлять своей собственной очередью, принимать гораздо больше соединений и обрабатывать их по мере необходимости с помощью различных потоков и / или мультиплексирования. Если вы хотите временно прекратить принимать соединения, у вас есть несколько потоков, чтобы попытаться править не одним. Если вы хотите закрыть свои потоки, вам, возможно, придется начинать их, пока они блокируются при принятии, а не полностью. Это усложняет балансировку нагрузки. Вне головы.

Похожие вопросы