Функция cond_broadcast () действует аналогично функции cond_signal (), за исключением того, что активизируются все ожидающие потоки. Каждый поток по очереди снова приобретает блокировку и выполняет код, который следует за вызовом функции cond_wait (). Порядок, в котором будет происходить активизация ожидающих потоков, не определен.
Применение функций cond_wait () и cond_broadcast () описано будет дальше па примере разработки адаптивного сервера с предварительным формированием потоков.
Потоки и сигналы.
Разработчики, которые планируют применять потоки в сочетании с сигналами, должны учитывать, что интеграция средств обработки сигналов со средствами многопоточной обработки относится к одной из наименее опробованных частей экспериментальной реализации потоков Perl. Проблема состоит в том, что время поступления сигналов является непредсказуемым и они могут быть доставлены в любой поток, выполняемый в данный момент, что приводит к неопределенным результатам.
Предполагается, что решение этой проблемы может быть достигнуто с помощью модуля Thread::Signal, который обеспечивает доставку всех сигналов в специальный поток, работающий параллельно с основным. Для его использования не нужно предпринимать каких-либо особых действий. Для запуска сигнального потока достаточно загрузить этот модуль.
use Thread::Signal;
Однако следует учитывать, что модуль Thread::Signal изменяет семантику сигналов, в результате чего их нельзя больше использовать для прерывания продолжительных системных вызовов. Поэтому следующий прием становится неприемлемым.
alarm (10); my $bytes = eval { local $SIG{ALRM) = sub { die }; sysread($socket,$data,1024); };
В некоторых случаях можно обойти это ограничение, заменив раздел eval {} вызовом функции select (). Такой прием будет также описан в дальнейшем.