El Cálculo de los Números Primos

Secuencial:
$ cat -n primes-without-threads.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3
 4  my @primes = (2);
 5
 6  NEW_NUMBER:
 7  for my $num (3 .. 1000) {
 8          foreach (@primes) { next NEW_NUMBER if $num % $_ == 0 }
 9          print "Found prime $num\n";
10          push @primes, $num;
11  }
Paralelo:
$ cat -n primes-using-threads.pl
     1  #!/usr/bin/perl -w
     2
     3  use strict;
     4
     5  use threads;
     6  use Thread::Queue;
     7
     8  my $stream = new Thread::Queue;
     9  my $kid    = new threads(\&check_num, $stream, 2);
    10
    11  for my $i (3 .. 1000) {
    12          $stream->enqueue($i);
    13  }
    14
    15  $stream->enqueue(undef);
    16  $kid->join;
    17
    18  sub check_num {
    19          my ($upstream, $cur_prime) = @_;
    20          my $kid = undef;
    21          my $downstream = new Thread::Queue;
    22          while (my $num = $upstream->dequeue) {
    23                  next unless $num % $cur_prime;
    24                  if ($kid) {
    25                          $downstream->enqueue($num);
    26                  } else {
    27                          print "Found prime $num\n";
    28                          $kid = new threads(\&check_num, $downstream, $num);
    29                  }
    30          }
    31          $downstream->enqueue(undef) if $kid;
    32          $kid->join if $kid;
    33  }

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19