Не могу победить реализацию таймаута в треде.Вот код, который работает:
-------------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use threads;
use Sys::SigAction qw( set_sig_handler );
t();
sub t {
eval {
set_sig_handler( 'ALRM', sub { die 'alarm!' } );
alarm(1); # определяем таймаут в 1 сек.
sleep(10); # здесь вместо sleep должен быть полезный код
alarm(0);
};
alarm(0);
if( $@ ) {
print "Timeout!\n";
}
else {
print "Ok\n";
}
}
-------------------------------------------------------------------------
Т.е. реализация таймаута нормально отрабатывает
А вот код, который не работает (меняем только одну строчку вызова функции t):
-------------------------------------------------------------------------
#!/usr/bin/perl -w
use strict;
use threads;
use Sys::SigAction qw( set_sig_handler );
threads->new( \&t )->join(); # вместо простого вызова функции t
sub t {
eval {
set_sig_handler( 'ALRM', sub { die 'alarm!' } );
alarm(1); # определяем таймаут в 1 сек.
sleep(10); # здесь вместо sleep должен быть полезный код
alarm(0);
};
alarm(0);
if( $@ ) {
print "Timeout!\n";
}
else {
print "Ok\n";
}
}
-------------------------------------------------------------------------
Тут через секунду программа вылетает с ошибкой:
Signal SIGALRM received, but no signal handler set.
Как побороть все это - не знаю...