Можно ли вызвать accept () для одного сокета из нескольких потоков одновременно?

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

 alk15 февр. 2014 г., 16:30
возможный дубликатIs accept() thread-safe?

Ответы на вопрос(1)

Решение Вопроса

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

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

Ваш ответ на вопрос