> Mi goal is that each thread could process an element of an array that
> has 10 elements, so thread0 process array[0], thread1 process array[1]
> and so on until thread9 process array[9]
> 
> Those 10 lines come from a file that Perl reads in chunks of ten lines
> until EOF

First of all, your code doesn't /do/ anything with the data you pass
it in proceso...

I'm curious, why 10 lines at a time? And honestly, you probably don't
need threads for this...

  my $group_size = 10;
  my @accumulator = ();
  while (<FILE>) {
    chomp;
    push @accumulator, $_;
    next if $. % $group_size;
    # do stuff with @accumulator
  }
  # do stuff with @accumulator (leftovers)

Some recommended reading on perl threads:
 <http://www.perlmonks.org/index.pl?node_id=288022>
 <http://www.perldoc.com/cgi-bin/htsearch?words=threads>

And here's some relatively generic threading code that should get you
started (if you still think you need to use threads):
--CODE--
#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;

our $group_size = 10;
our $num_threads = 3;
our @threads = ();

our @buffer : shared = ();                        
our $main_done : shared = 0;

sub process_buffer {
  my $self = threads->self;
  while(1) {
    my @rows = ();
    { lock(@buffer);
      if (not @buffer) {
        if ($main_done) {
          cond_broadcast(@buffer);
          print STDERR 'thread '. $self->tid ." exiting\n";
          return;
        }
        print STDERR 'thread '. $self->tid ." waiting on buffer\n";
        cond_wait(@buffer);
      }
      next if not $main_done and @buffer < $group_size;
      push(@rows, shift(@buffer))
        while @buffer and @rows < $group_size;
    }
    next if not @rows;

    print 'thread '. $self->tid .': '. join(', ', @rows) ."\n";
  } # end infinite while
}

for my $i (1 .. $num_threads) {
  print STDERR "starting thread $i\n";
  unshift @threads, threads->create('process_buffer');
}

while (<DATA>) {
  chomp;
  next unless /^\w+/;
  lock(@buffer);
#  print STDERR "loading buffer up with [$_] on line $.\n";
  push @buffer, $_;
  cond_signal(@buffer) unless $. % $group_size;
}

{ lock($main_done);
  print STDERR "main thread done\n";
  $main_done = 1;
  lock(@buffer);
  cond_broadcast(@buffer);
}

for my $t (@threads) {
  $t->join();
  print STDERR 'joined thread '. $t->tid ."\n";
}

__DATA__
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to