#! perl -slw use strict; use threads; use threads::shared; my $sem :shared; sub tprint { lock $sem; print @_; } my $dieNow :shared = 0; $SIG{INT} = sub { tprint 'sigint seen'; $dieNow = 1; return; }; sub thread { my $tid = threads->tid; my $delay = int rand 10; my $next = time + $delay; while( sleep 1 ) { last if $dieNow; redo unless time > $next; tprint "[$tid] ping"; $next = time + $delay; } tprint "$tid] ending"; } my @threads = map async( \&thread ), 1 .. 10; sleep 1 until $dieNow; $dieNow = 1; $_->join for @threads;