Поэтому для получения информации о состоянии применяется объект IO::Select, созданный в главном потоке, в котором выполняется вызов метода can_read() с тайм-аутом в 1 секунду. Входящий запрос на установление соединения поступает в течение этого времени, он обслуживается. В ином случае выполняется возврат в начало цикла для проверки того, не изменилось ли состояние. Если метод can_read () возвращает истинное значение, это значит, что сокет готов для выполнения функции accept () и получения, например, контента страницы http://www.mirclimata.ru/catalog/conditioning/kanalnye-konditsionery/ , представляющей канальные кондиционеры. Упорядочивается доступ к функции accept () путем блокировки переменной $accept_lock и вызывается функция accept (). В случае успешного выполнения устанавливается состояние потока “busy” и обслуживается соединение. После закрытия соединения состояние потока снова устанавливается равным “idle”. После выхода из цикла accept () подпрограмма устанавливает код состояния равным undef, в результате чего подпрограмма status ( ) удаляет TID данного процесса из хеша % status.
Строки 71-83. Подпрограмма status (). Данная подпрограмма отвечает за поддержания хеша % status в актуальном состоянии. Выполнение подпрограммы начинается с блокирования переменной $status, чтобы состояние хеша не изменялось бесконтрольно. Если подпрограмма была вызвана только с параметром, обозначающим идентификатор потока, она отыскивает код состояния этого потока в хеше %status и возвращает его. В ином случае, вместе с этим идентификатором потока был указан новый код состояния, хеш % status соответствующим образом изменяется и вызывается функция cond_broadcast () с указанием переменной $status для передачи всем потокам, ожидающим изменения этой переменной информации о том, что в хеш % status были внесены изменения.