Является ли accept () поточно-ориентированным? - PullRequest
11 голосов
/ 26 февраля 2011

В настоящее время я пишу простой веб-сервер на C для курса, который я делаю.Одно из требований заключается в том, чтобы мы реализовали пул потоков для обработки соединений с использованием pthreads.

Я знаю, как поступить примерно так (вызывая accept в главном потоке и передавая файловый дескриптор потоку freee),однако мой друг предложил альтернативный метод, чем тот, который я имел в виду: создать все мои потоки заранее и заставить их все бесконечно зацикливаться на вызове для принятия.Идея в том, что accept блокирует все незанятые потоки, а при установлении соединения передает дескриптор файла только одному из них.Затем, когда данный поток завершает соединение, он возвращается к началу цикла и блокирует вызов для повторного принятия.Использование вызова метода accept () в качестве семафора по существу.Это немного упростит реализацию, как он полагает, так как вам не нужно отслеживать, какие потоки заняты, а какие готовы к соединению.В теории это также будет иметь меньшую задержку, поскольку поток может немедленно начать выполнение.

Мой вопрос: это безопасно?Я планирую реализовать это и опробовать, но я еще не готов, и мне довольно любопытно узнать ответ.Я искал в Google и здесь на stackoverflow, но не мог найти никого, делающего это таким образом.Принимать нить безопасно?Я предполагаю, что при таком подходе будет больше накладных расходов, поскольку вы все время запускаете все свои потоки. Являются ли два подхода простым компромиссом между памятью и задержкой?

Редактировать: Я не уверен, должно ли это быть сообществомвики, прошу прощения, если это так, я не могу найти кнопку: P

1 Ответ

13 голосов
/ 26 февраля 2011

Да. Это распространенный способ проектирования многопоточных серверов и принятая практика проектирования.

Вы также можете fork несколько раз, и дочерние процессы будут вызывать accept, это позволит вам выполнять многопоточность без необходимости в библиотеке потоков. Старые серверы делают это.

...