use strict ; use warnings ; use threads ; use Thread::Queue ; my @array = qw(a b c d e f g h); my @results; my $param_queue = new Thread::Queue ; my $result_queue = new Thread::Queue ; my $c = 2 ; # concurrent threads my $n = 10 ; # amount of work my @children ; for (1..$c) { # Start the threads push @children, threads->create(\&sub_thread) ; } ; for (1..$n) { # Dispatch the work $param_queue->enqueue([@array]) ; } ; for (1..$n) { # Collect the results push @results, $result_queue->dequeue() ; } ; $param_queue->enqueue((undef) x $c) ; # Signal the threads to stop foreach (@children) { # Collect the terminated threads $_->join() ; } ; sub sub_thread { my $task = 0 ; my $tid = threads->tid() ; print "child $tid: started" ; while (my $p = $param_queue->dequeue()) { $task++ ; my @temp = @$p ; print "child $tid/$task: @temp\n" ; sleep(rand(2)+2) ; $result_queue->enqueue("whatever from child $tid/$task") ; print "child $tid/$task: done\n" ; } ; print "child $tid: terminated\n" ; } ;