2015-10-08 1 views
2

У меня есть скрипт Perl, который порождает группу рабочих потоков. Когда один из этих потоков сталкивается с фатальной ошибкой, мне бы хотелось, чтобы скрипт ENTIRE умирал и печатал сообщение об ошибке.Perl die (и остановить всю программу) в потоке

Проблема заключается в том, что ... когда вы используете die в потоке, это приведет к завершению текущего потока только сообщением Thread 42 terminated abnormally: blah blah blah..., а остальная часть скрипта будет продолжать работать.


Пример:

use strict; 
use warnings; 
use threads; 

# Create threads 
for my $i (1 .. 5) { 
    threads->create(\&do_something, $i); 
} 

# Wait for all threads to complete 
$_->join() for threads->list(); 

sub do_something { 
    my $i = shift; 
    die "I'm died" if $i == 3; 
} 

Выход:

резьбы 3 завершилась аварийно: Я умер в линии 15


Как я могу сделать фатальную ошибку в потоке, убить весь скрипт?

ответ

4

По perldoc threads:

Вызов exit EXPR внутри нити вызывает целое приложение прекратить. Из-за этого использование exit() внутри резьбового кода или модулей, которые могут использоваться в поточных приложениях, настоятельно не рекомендуется.

Если exit() действительно необходимо, а затем рассмотреть вопрос об использовании следующих:

threads->exit() if threads->can('exit'); # Thread friendly 
exit(status); 
+0

просто звоню выход делает работу, но она печатает некрасивый «Программа прекращается с запуском потоков» ошибка. Есть ли способ убить все потоки и выйти чисто? – tjwrona1992