Hi list,
I've some doubts with a multi-threads script. My goal is to create a script
with the same max number of threads running at all times.
For example: I've an array with 9 elements and 3 threads to process it; each
thread can process an element using a different time (a thread could end
before another) and I would like 3 threads always running.
My idea is to take an element from a queue, start threads to reach the
maximum number of active threads allowed and simultaneously start a separate
(but unique) thread to wait every thread in execution.
In attachment my "solution". Have you any tips? I would not use other
modules as well threads, threads::shared, thread::queue.
Thank you very much!
Al
#!/usr/bin/perl -w
$|=1;
use strict;
use threads;
use threads::shared;
use Thread::Queue;
my $maxthreads = 3;
my @users = ('jim','jane','tom','tim','al','ed','mary','kim','meg');
our $q :shared;
$q = new Thread::Queue;
# fill the queue
$q->enqueue($_) for @users;
# thread to wait (join) the threads
my $MonitorRunningThreads = threads->new(\&MonitorRunningThreads);
my $n = $q->pending;
print "Elements in the queue : $n\n";
# while the queue is not empty
while ($q->pending > 0) {
# if the running threads list is <= the max threads
if ((threads->list(threads::running)) <= $maxthreads) {
my $thr = threads->new(\&UseMe,$q->dequeue_nb);
}
}
print "\n\nwaiting...\n";
# wait again the last threads; > 1 because MonitorRunningThreads thread is
running
while ((threads->list(threads::running)) > 1){};
exit(0);
sub UseMe {
my $user = shift;
my $sleep_time = rand(5);
print "$user sleep for $sleep_time seconds...\n";
sleep $sleep_time;
}
# wait the threads
sub MonitorRunningThreads {
while(1) {
foreach my $thr (threads->list(threads::joinable)) {
if ($thr->tid && !threads::equal($thr, threads->self)
&& !threads::equal($thr,$MonitorRunningThreads)){
print "\tWaiting for thread " . $thr->tid . "
to join\n";
print "\tThread " . $thr->join . " has
joined.\n";
}
}
}
}