Многопоточность, Windows и Perl

В эпоху повсеместного распространения многоядерных процессоров интересно узнать, что же для многопоточного программирования есть в Perl. Не претендуя на самое-правильное-решение, приведу простой работающий шаблон для построения многопоточных скриптов Perl на платформе Win32.


Для биоинформатиков - многопоточность уже реализована в BLAST - ссылка.

 

# use subs::parallel;
 
  sub np{
    my ($arg1, $arg2) = @_;
      for($i=0;$i<$arg1;$i++) {
      $t=$i*2;
      $t=$t/2;
 #         open (FORGET, ">>forget");
 #         print FORGET "bar - $arg2\n";
 #         close(FORGET);
      }
  }
 
  sub bar{
    my ($arg1, $arg2) = @_;
      for($i=0;$i<$arg1;$i++) {
      $t=$i*2;
      $t=$t/2;
 #         open (FORGET, ">>forget");
 #         print FORGET "bar - $arg2\n";
 #         close(FORGET);
      }
  }
 
  sub foo { 
    my ($arg1, $arg2) = @_;
    for($j=0;$j<$arg1;$j++) {
      $t=$i*2;
      $t=$t/2;
 #
    #    open (FORGET, ">>forget");
  #        print FORGET "foo - $arg2\n";
  #        close(FORGET);
       }
         
  }
 
#  parallelize_sub('bar');  # subroutine named bar now runs in parallel
#  parallelize_sub('foo');
     
  open (FORGET, ">forget");
  print FORGET "start\n";
  close(FORGET);
 

              np(20000000,1);

#  my $foo = foo(10000000,1); # returns immediately
#  my $bar = bar(10000000,2); # also returns immediately
#  if ($foo == $bar) {   # now it might block waiting for both to finish
      #  ##  
#  }
 
  print "work is finished";