Как очистить потоки после их завершения в Perl? - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть Perl-скрипт, который запускает потоки, когда проверяется определенное выражение.

while ($launcher == 1) {
    # do something
    push @threads, threads ->create(\&proxy, $parameters);
    push @threads, threads ->create(\&ping, $parameters);
    push @threads, threads ->create(\&dns, $parameters);
    # more threads
    foreach (@threads) {
    $_->join();
    }
}

Первый цикл работает нормально, но во втором сценарий завершается со следующей ошибкой:

Тема уже присоединена к строке 290 launcher.pl. Perl вышел с активными потоками: 1 работает и не присоединился 0 закончил и не присоединился 0 работает и отсоединено

Думаю, я почисту @threads, но как я могу это сделать? Я даже не уверен, в этом ли проблема.

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

Просто очистите @threads в конце цикла:

@threads = ();

Или лучше объявите @threads с my в начале цикла:

while ($launcher == 1) {
    my @threads;
2 голосов
/ 30 ноября 2011

Самое простое решение - создать массив внутри цикла while (while {my @threads; ...}), если он не нужен где-либо еще.В противном случае вы можете просто @threads = () или @threads = undef в конце цикла while.

Вы также можете установить переменную my $next_thread; вне цикла while и затем назначить $next_thread = @threads первым в цикле while.и измените ваш foreach цикл на

for my $index ($next_thread .. $#threads) {
    $threads[$index]->join();
}

или пропустите это и просто зациклите на кусочке трех последних добавленных потоков

for (@threads[-3..-1) {
    $_->join();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...