#! 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; #### C:\test>1007974 [3] ping [9] ping [1] ping [3] ping [2] ping [4] ping [3] ping [1] ping [9] ping [5] ping [3] ping [6] ping [10] ping sigint seen [3] ping 7] ending 2] ending 5] ending 8] ending 1] ending 9] ending 4] ending 6] ending 10] ending 3] ending