#!/usr/bin/perl use strict; use warnings; use threads 1.39; use threads::shared; use Thread::Queue; ### Global Variables ### # Maximum working threads my $MAX_THREADS = 1; # Flag to inform all threads that application is terminating my $TERM :shared = 0; # Prevents double detach attempts my $DETACHING :shared; ### Signal Handling ### # Gracefully terminate application on ^C # or command line 'kill' $SIG{'INT'} = $SIG{'TERM'} = sub { print(">>> Terminating <<<\n"); $TERM = 1; }; DeployThread(); sub DeployThread { # Manage the thread pool until signalled to terminate while (! $TERM) { # Keep max threads running for (my $needed = $MAX_THREADS - threads->list(); $needed && ! $TERM; $needed--) { # New thread threads->create('worker'); } } # Detach and kill any remaining threads foreach my $thr (threads->list()) { lock($DETACHING); $thr->detach() if ! $thr->is_detached(); print "Killing " . $thr->tid() . "\n"; $thr->kill('KILL'); } print("Done\n"); } # A worker thread sub worker { ### INITIALIZE ### # My thread ID my $tid = threads->tid(); printf("Working -> %3d\n", $tid); ### WORK ### # Do some work while monitoring $TERM my $sleep = 5 + int(rand(10)); my $i = 0; while (1) { print "Working ...\n"; sleep 1; $i ++; last if $i == 5; } ### DONE ### $TERM = 1; # Remove signal handler $SIG{'KILL'} = sub {}; # Tell user we're done printf(" %3d <- Finished\n", $tid); # Detach and terminate lock($DETACHING); threads->detach() if ! threads->is_detached(); threads->exit(); }
In reply to Re: Wx subs and threads
by Anonymous Monk
in thread Wx subs and threads
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |