Является ли accept() потокобезопасным?

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

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

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

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

Ответ 1

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

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