I thought about the locking approach, but this will all eventually be wrapped into a Windows services tool that will shutdown the service gracefully.
The way services work, the process needs to ping the service control manager once in a while when it is still running. So, if a thread didn't shutdown after a join() in x number of seconds, Windows would assume the program is not responding. And who knows how long a worker thread will spend on one task before saying hello again. This is essentially how they will talk: Worker Threads <-> Master Thread / Services Callback Thread <-> Windows Services I can say I found something similar to your idea that works nicely. Thanks to the 'async' command, I can use a shared variable and adjust that variable after it asynchronously joins the threads. Yes, very much in the realm of hacks and bad ideas, but it works. With the verbage of this thing, it really sounds like nonsense spawning threads from the master and joining them to another child. <xmp> # Test Threads use threads; use threads::shared; use Win32; use strict; use vars qw ($counter $thr $thread $threads); my $thread_shutdown : shared; Log ("Starting Thread Test"); $thr = threads->create (\&ChildThread, 0); $counter = 0; while ($counter++ < 60) { sleep (1); Log ('This is the main thread speaking: '.localtime(time())); } # Signal shutdown state $thread_shutdown = 1; # Asynchronously join threads. $threads = threads->list(); async { my $result; foreach $thread ($threads) { $result = $thread->join (); Log ("Result for thread ".$thread->tid.": ".$result); } # Signal final shutdown state $thread_shutdown = 2; }; # Await shutdown state change while ($thread_shutdown < 2) { Log ("Awaiting thread death."); sleep (10); } Log ("Application is ended."); # Functions sub Log { my( $Message ) = @_; print $Message."\n"; } sub ChildThread { my ($counter) = @_; while (!$thread_shutdown) { Log ('This is the child thread speaking: '.localtime(time())); Win32::Sleep ((rand(12)+1) * 500); } Log ('Thread has ended.'); return 10; } </xmp> >> I'd love it if I could just upgrade perl, but corporate bureaucracy >> sucks and the new versions need approval for security purposes. I >> initially tried it with 5.6.1 with less success, and 5.8.0 seems to >> be very close less the is_running issue. All I really need is some >> way to determine if the thread is still running even if it's checking >> if the process id exists. When it is, I want to SIGUSR1 the thread. >> >> 'threads' is a standard module, so I have no clue why it's having >> amnesia. The module is found at C:/Perl/lib/threads.pm and not part >> of the ppm. >> >> Here is a short example of threads I'm testing: >> >> <xmp> >> # Test Threads >> use threads; >> use threads::shared; >> use strict; >> use vars qw ($counter $thr); >> >> Log ("Starting Thread Test"); >> $thr = threads->create (\&ChildThread, 0, 1); >> >> $counter = 0; >> while ($counter++ < 10) { >> Log ("This is the main thread (".$counter." sec)"); >> sleep (1); >> } >> >> # The following gives an error that is_running.al is missing. >> # Tried threads->list (threads::running) to search and compare: gave >> bareword error. # Tried "$thr->is_running" without success: also said >> is_running.al missing. >> while ($thr->is_running()) { >> Log ("Killing thread."); >> $thr->kill('SIGUSR1'); >> sleep (4); >> } >> >> Log ("Thread killed."); >> >> # Functions >> >> sub Log { my( $Message ) = @_; print $Message."\n"; } >> >> sub ChildThread { >> my ($counter, $to_screen) = @_; >> my $count = 0; >> our $thread_term = 0; >> $SIG{'SIGUSR1'} = sub { Log('Received user1 notice.'); >> $thread_term = 1; return 0; }; $SIG{'KILL'} = sub { Log('Received >> kill notice.'); $thread_term = 1; return 0; }; >> >> while (!($thread_term)) { >> Log ('This is the child thread ('.($count++ * 2).' sec)'); >> sleep (2); >> } >> Log ('Thread has ended.'); >> } >> </xmp> > > It occurs to me that you might be using the documentation for a later > version of Perl than you are using. The function is_running is > documented in 5.10.0, but not in an older version (5.8.5) that I have. > Neither is the kill function come to that. > > Try something like the following, which seems to work in my older > version. > > use strict; > use warnings; > use threads; > use threads::shared; > > my $thread_term : shared = 0; > > Log ("Starting Thread Test"); > my $thr = threads->create (\&ChildThread, 0, 1); > > my $counter = 0; > while ($counter++ < 10) { > Log ("This is the main thread (".$counter." sec)"); > sleep (1); > } > > terminate(1); > $thr->join(); > Log ("Thread killed."); > > # Functions > > sub Log { my( $Message ) = @_; print $Message."\n"; } > > sub ChildThread { > my ($counter, $to_screen) = @_; > my $count = 0; > > while (!terminate()) { > Log ('This is the child thread ('.($count++ * 2).' sec)'); > sleep (2); > } > Log ('Thread has ended.'); > } > > sub terminate { > lock $thread_term; > $thread_term = $_[0] if defined $_[0]; > return $thread_term; > } > > HTH > > -- > Brian Raven > > ========================================= > Atos Euronext Market Solutions Disclaimer > ========================================= > > The information contained in this e-mail is confidential and solely for > the intended addressee(s). Unauthorised reproduction, disclosure, > modification, and/or distribution of this email may be unlawful. > If you have received this email in error, please notify the sender > immediately and delete it from your system. The views expressed in this > message do not necessarily reflect those of Atos Euronext Market > Solutions. > > Atos Euronext Market Solutions Limited - Registered in England & Wales > with registration no. 3962327. Registered office address at 25 Bank > Street London E14 5NQ United Kingdom. > Atos Euronext Market Solutions SAS - Registered in France with > registration no. 425 100 294. Registered office address at 6/8 Boulevard > Haussmann 75009 Paris France. > > L'information contenue dans cet e-mail est confidentielle et uniquement > destinee a la (aux) personnes a laquelle (auxquelle(s)) elle est adressee. > Toute copie, publication ou diffusion de cet email est interdite. Si cet > e-mail vous parvient par erreur, nous vous prions de bien vouloir prevenir > l'expediteur immediatement et d'effacer le e-mail et annexes jointes de > votre systeme. Le contenu de ce message electronique ne represente pas > necessairement la position ou le point de vue d'Atos Euronext Market > Solutions. > Atos Euronext Market Solutions Limited Société de droit anglais, > enregistrée au Royaume Uni sous le numéro 3962327, dont le siège social se > situe 25 Bank Street E14 5NQ Londres Royaume Uni. > > Atos Euronext Market Solutions SAS, société par actions simplifiée, > enregistré au registre dui commerce et des sociétés sous le numéro 425 100 > 294 RCS Paris et dont le siège social se situe 6/8 Boulevard Haussmann > 75009 Paris France. > ========================================= > > _______________________________________________ > ActivePerl mailing list > ActivePerl@listserv.ActiveState.com > To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs > _______________________________________________ ActivePerl mailing list ActivePerl@listserv.ActiveState.com To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs