Perl Multithreading - Perl завершился с активными потоками: закончен и не присоединен

Я пытаюсь создать потоки подпрограммы в моей программе (называется Рекомбинация ). Я использовал приведенный ниже код для создания потоков, которые я адаптировал из http://chicken.genouest.org/perl/multi-threading-with-perl/. Я использовал этот код при создании этих потоков. в цикле, при этом количество потоков зависит от переменной $ParentTally, которая разная для каждого цикла (а $ParentTally может быть до 1000, и я не хотел запускать 1000 потоков одновременно)

my $nb_process = 20;
my $nb_compute = $ParentTally;
my $i=0;
my @running = ();
my @Threads;
my %NewPopulation;

while (scalar @Threads < $nb_compute) {
    @running = threads->list(threads::running);
    if (scalar @running < $nb_process) {
        my $Offspring= threads->new (sub {Recombination(\%Parent1Chromosome, \%Parent2Chromosome)});
        push (@Threads, $Offspring);
        my $tid = $Offspring->tid;
    }

    @running = threads->list(threads::running);
    foreach my $thr (@Threads) {
        if ($thr->is_running()) {
           my $tid = $thr->tid;
        }
       elsif ($thr->is_joinable()) {
          my $tid = $thr->tid;
          my $Offspring1=$thr->join();
          $NewPopulation{$Offspring1}{'Tally'}+=1;
       }
    }
    @running = threads->list(threads::running);
    $i++;
}

while (scalar @running != 0) {
     foreach my $thr (@Threads) {
      if ($thr->is_joinable()){
         my $Offspring1=$thr->join(); 
         $NewPopulation{$Offspring1}{'Tally'}+=1;
      }
    }
    @running = threads->list(threads::running);
}

(Примечание: $ParentTally берется из другого хэша ранее в коде, my $ParentTally=$hashref->{'Tally'}; так что эта часть программы каждый раз зацикливается с другим значением $ParentTally. %Parent1Chromosome и %Parent2Chromosome создаются ранее в программе.Подпрограмма «Рекомбинация» довольно длинная, поэтому я ее не публиковал, но она возвращает целое число. )

Часто при запуске программы (хотя и не всегда, большая часть более раннего кода зависит от случайных переменных, поэтому программа никогда не работает одинаково) после ее завершения я получаю «Perl завершен с активными потоками: 'число' завершено и несвязанные» («число» варьируется в зависимости от тиража). Я думал, что:

 while (scalar @running != 0) {
     foreach my $thr (@Threads) {
      if ($thr->is_joinable()){
         my $Offspring1=$thr->join(); 
         $NewPopulation{$Offspring1}{'Tally'}+=1;
      }
    }

будет означать, что все потоки завершатся, прежде чем перейти к следующему разделу кода? Что я делаю неправильно? (Я никогда раньше не использовал нити). Я изучал использование http://www.perlmonks.org/?node_id=735931, но я не совсем понял, как использовать Thread::Queue, и не смог найти учебник (и не понял http://perldoc.perl.org/Thread/Queue.html). Спасибо

0
задан Lisa 20 June 2012 в 14:32
поделиться