in reply to yet another thread/signal question
The way it works is the main thread gets all signals first, then it sends them on to the child threads... makes sense to me. Then each thread needs to have it's own handler. Each thread can be tracked by it's pid. Here is a simple script to play with. :-)
#!/usr/bin/perl use warnings; use strict; use threads 'exit' => 'threads_only'; my $thr; print "I'm the parent pid-> $$\n"; my $thr1 = threads->new(\&sub1); my $thr2 = threads->new(\&sub2); my $thr3 = async{ my $myobject = threads->self; my $mytid= $myobject->tid; $SIG{'KILL'} = sub{ print "tid $mytid exiting\n"; threads->exit() } +; print "In the thread $myobject tid->$mytid \n"; my $count = 0; while(1){ $count++; print "\t\t\t\t\t\t\t\t$mytid -> $count\n"; sleep 1; } }; for(1..10){ print "$_\n"; if( $_ == 4 ){ $thr1->kill('KILL')->detach } if( $_ == 7 ){ $thr2->kill('KILL')->detach } if( $_ == 9 ){ $thr3->kill('KILL')->detach } sleep 1; } exit; sub sub1{ my $myobject = threads->self; my $mytid= $myobject->tid; $SIG{'KILL'} = sub{ print "tid $mytid exiting\n"; threads->exit() }; print "In the thread $myobject tid->$mytid \n"; my $count = 0; while(1){ $count++; print "\t\t\t$mytid -> $count\n"; sleep 1; } } sub sub2{ my $myobject = threads->self; my $mytid= $myobject->tid; $SIG{'KILL'} = sub{ print "tid $mytid exiting\n"; threads->exit() }; print "In the thread $myobject tid->$mytid \n"; my $count = 0; while(1){ $count++; print "\t\t\t\t\t$mytid -> $count\n"; sleep 1; } }
|
|---|