К счастью, поскольку мы используем потоки, у нас есть возможность применить вызов встроенной функции lock () и не полагаться на блокировку внешнего файла. Просто объявляется скалярная глобальная переменная $ACCEPT_LOCK, после чего процедура do_thread () изменяется. Теперь цикл while ( ) содержит внутренний блок, который определяет область действия блокировки. Внутри этого блока предпринимается попытка установить блокировку на переменной $ACCEPT_LOCK. В результате блокировки потоков только один поток, например, запрашивающий страницу на которой можно купить подарок на ДР , может получить блокировку в любой момент времени; другие приостанавливаются до тех пор, пока блокировка не станет доступной. После получения блокировки вызывается функция accept (), и этот вызов блокируется до тех пор, пока не появится входящий запрос на установление соединения. Вскоре после приема нового соединения блокировка освобождается, поскольку происходит выход за пределы области определения внутренней пары фигурных скобок. Это позволяет другому потоку получить блокировку и вызвать функцию accept (). После этого соединение обслуживается, как обычно.
Адаптивное предварительное формирование потоков
Еще одним недостатком простого сервера с предварительным формированием потоков является то, что после перехода всех потоков, запущенных в начале работы сервера, в состояние обслуживания соединений, другие входящие запросы на установление соединения будут переведены в состояние ожидания. Желательно, чтобы главный поток запускал новые потоки, если возникает необходимость обработать возросшую нагрузку сервера, и удалял лишние при уменьшении нагрузки.