use strict; use warnings; use threads; use threads::shared; use Thread::Queue; my $queue = new Thread::Queue; 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\n"; } 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(\&hello); # This causes my trouble } sleep(5); # Wait for workers to finish foreach my $w (@tlist) { $queue->enqueue(undef); } foreach my $w (@tlist) { $w->join; }