Это требование можно выполнить с использованием подхода, аналогичного применяемому в сервере с предварительным ветвлением, создав глобальный xеш % STATUS, с помощью которого главный поток сервера мог бы вести контроль, а все прочие потоки могли вносить изменения. Таким образом можно осуществлять получение, например, страницы с информацией о шинах http://ek.ua/list/337/nokian/ с контролируемым обслуживанием потока. В отличие от сервера с предварительным ветвлением, в данном случае нет необходимости использовать каналы или разделяемую память для поддержки хеша в актуальном состоянии. Поскольку все потоки работают в одном и том же процессе, они могут вносить изменения в хеш % STATUS непосредственно, если будут приняты соответствующие меры по синхронизации их доступа к хешу путем его блокировки перед внесением изменений.
Ключами хеша %STATUS являются идентификаторы потоков (TID — thread identifier), а возможными значениями — строки “busy”, “idle” или “goner”. Первые два кода состояния имеют такой же смысл, как и в серверах с предварительным ветвлением. Третий код состояния будет описан позже. Чтобы упростить управление хешем %STATUS, можно применить небольшую подпрограмму status (), которая позволяет потокам проверять и изменять хеш, не нарушая работу других потоков. Получив значение TID, подпрограмма status () возвращает состояние указанного потока.
my $tid = Thread->self->tid;
шу $status = status($tid);
При вызове с двумя параметрами подпрограмма status () изменяет состояние потока.
status($tid => 'busy');
Если второй параметр имеет значение undef, подпрограмма status () полностью удаляет указанный поток из хеша % STATUS.
В каждом цикле accept () рабочего потока подпрограмма status () вызывается для установки состояния текущего потока в значение “idle” перед вызовом функции accept () и в значение “busy” — после приема соединения.