Couldn't just send a signal to yourself to awaken the sleeping kids/threads? Here is a forking example:
[root@devel3 logtest]# cat test.pl
#!/usr/bin/perl
$SIG{INT} = sub { print "Caught zap in $$\n"; exit };
if ( my $pid = fork() ) {
print "Parent Start\n";
sleep 5;
local $SIG{INT} = sub{ print "Parent $$ ignoring zap\n" };
kill 2 => $pid, $$;
sleep 10;
print "Parent exit!\n";
}
else {
print "Child start\n";
sleep 10;
print "Child exit!\n";
}
[root@devel3 logtest]# ./test.pl
Parent Start
Child start
Parent 21850 ignoring zap
Caught zap in 21851
Parent exit!
[root@devel3 logtest]#