for( 1 .. NTHREADS ) { $Q->enqueue( scalar ); lock $pos; $pos = tell FILE; } #### #! perl -slw use strict; use threads; use Thread::Queue; use Time::HiRes qw[ sleep ]; use constant NTHREADS => 30; open FILE, '<', $ARGV[ 0 ] or die $!; my $size = -s FILE; sub thread { my $Q = shift; my $tid = threads->tid; while( my( $pos, $line ) = split $;, $Q->dequeue ) { printf "%3d: (%10d, %10d) :%s", $tid, $pos, $size, $line; sleep rand .5; } } my $Q = Thread::Queue->new; my @threads = map threads->create( \&thread, $Q ), 1 .. NTHREADS; while( !eof FILE ) { sleep 0.001 while $Q->pending; $Q->enqueue( join $;, tell( FILE ), scalar ) for 1 .. NTHREADS } $Q->enqueue( (undef) x NTHREADS ); $_->join for @threads;