Perl - захват неожиданного завершения - PullRequest
1 голос
/ 11 марта 2011

У меня есть некоторый код, который порождает 5 потоков одновременно.Я отсоединяю эти потоки, но у меня есть общая переменная $THREADCOUNT, которую я увеличиваю в начале подпроцедуры, вызываемой вызовом потока, и уменьшаю в конце потока.Когда $THREADCOUNT равно 0, я порождаю еще 5 раз.

Проблема в том, что иногда поток неожиданно завершает работу, и $THREADCOUNT никогда не достигает 0, поэтому программа останавливается.Можно ли как-нибудь захватить такой выход и иметь $THREADCOUNT-- на неожиданном выходе?

Большое спасибо.Это мой первый пост, так что извиняюсь, если немного неясно.

Крис

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Я не могу понять, когда кто-нибудь захочет использовать detach.Я бы использовал что-то вроде

use threads;

my %workers;

sub start_worker {
   my $thread = threads->create(@_);
   $workers{$thread->tid} = $thread;
   return $thread;
}

sub collect_finished_workers {
   for my $thread (threads->list(threads::joinable)) {
      $thread->join()
         if delete($workers{$threads->tid});  # Don't assume we own all threads.
   }
}

sub get_worker_count {
   collect_finished_workers();
   return 0+keys(%workers);
}

Обратите внимание, что это устраняет проблему в вашем коде, когда поток не считается запущенным в течение короткого времени после его запуска.

1 голос
/ 11 марта 2011

Действительно ли общая переменная $THREADCOUNT необходима? Звонок на threads->list(threads::running) скажет вам, все ли еще работает ваш спавн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...