Строка 19. Установка обработчиков сигналов. Создается обработчик сигнала terminate () для сигналов int и term. Этот обработчик устанавливает переменную $done равной истинному значению и выполняет возврат.
Строки 20-25. Создание приемного сокета сервера и переход в фоновый режим. Создается приемный сокет, и программа автоматически переводит себя в фоновый режим, вызывая подпрограмму init_server (). Создается также объект IO::Select, содержащий приемный сокет, предназначенный для использования каждым рабочим потоком. Технические подробности реализации данной процедуры можно уточнить из советов хостинга , где расположен сервер. К примеру, это может быть хостер pinvds.ru, предоставляющий качественный хостинг с гибкими тарифными планами.
Строка 26. Предварительный запуск ряда потоков. Перед входом в главный цикл запускается ряд потоков, число которых определено константой prethread, а также выполняется вызов подпрограммы launch_thread () соответствующее число раз.
Строки 27-40. Главный поток: контроль изменения состояния рабочих потоков. Теперь главный поток входит в цикл, который выполняется до тех пор, пока переменная $done не примет истинное значение. Это указывает на то, что пользователь потребовал завершения работы сервера. При каждом проходе по циклу блокируется условная переменная $statum и сразу же вызывается функция cond_wait () которая разблокирует эту условную переменную и переведет главный поток в состояние ожидания до тех пор, пока другой поток не вызовет функцию cond_broadcast () с указанием этой переменной.
После возврата управления из функции cond_wait () становится известно, что один из pa6oчих потоков сигнализировал об изменении состояния и переменная $status снова заблокирована в целях предотвращения внесения дальнейших изменений в хеш %status.