my $c; while( sleep 1 ) { print "timer event"; $c = scalar keys %results; last if $c; } pp $c; #### $ perl5.14.1 x.pl timer event 15466 $ perl5.14.1 x.pl timer event timer event 436817 $ perl5.14.1 x.pl timer event timer event 445051 $ perl5.14.1 x.pl timer event timer event 499204 #### #! perl -lw use strict; use bignum; use threads; use threads::shared; use Data::Dump qw[ pp ]; my %results :shared; async { my %comps; for my $i ( 1 .. 1e6 ) { $comps{ $i } = $i ** $i; } lock(%results); %results = %comps; }->detach; my $c; while( sleep 1 ) { print "timer event"; $c = do { lock(%results); scalar keys %results; }; last if $c; } pp $c; #### my %results :shared; my $done :shared; async { my %comps; for my $i ( 1 .. 1e6 ) { $comps{ $i } = $i ** $i; } %results = %comps; $done++; # using $done = 1 doesn't want to work - more thought required! }->detach; my $c; while( sleep 1 ) { print "timer event"; last if $done; } pp scalar keys %results;