use strict; use warnings; use threads; use threads::shared; use Thread::Queue; my $queue = new Thread::Queue; my $pdispatch = { 'greeting' => \&hello, }; sub hello { print "Hello\n"; } sub worker { my $tid = threads->self->tid; print "[$tid] Starting\n"; while (my $job = $queue->dequeue) { print "Got a job: '$job'\n"; my $psub = $pdispatch->{$job}; if ($psub || 0) { $psub->(); } } print "[$tid] Terminating\n"; } my @tlist; my $workers = 4; # Start Workers for (my $i = 0; $i < $workers; $i++) { push(@tlist, threads->new(\&worker)); } for (my $i = 0; $i < 10; $i++) { $queue->enqueue('greeting'); # No more trouble :-) } sleep(5); # Wait for workers to finish foreach my $w (@tlist) { $queue->enqueue(undef); } foreach my $w (@tlist) { $w->join; }