2013-08-30 3 views
0

У меня есть программа perl, которая порождает несколько потоков. Каждый поток обрабатывает некоторую задачу (путем отключения других системных команд и т. Д.), А затем, когда все это делается, ждет.perl: Нити не умирают, когда основной процесс умирает

После того, как все потоки выполнены, они подают сигнал на родительский процесс. Затем родитель загружает новые задания и сигнализирует, что потоки будут работать над этими новыми задачами.

В идеале эта программа будет работать вечно.

Теперь, если я убью его в командной строке с kill -9 MainProgram.pl, его не убить! Я вижу результат работы, в котором работают потоки, а затем я также вижу, что после того, как они сделаны, они получают новые рабочие места и просто продолжают и продолжают ...

Я абсолютно смущен. Если я сделаю kill -9 MainProgram.pl, он должен убить все тем он владеет, не так ли? Независимо от того, что делают нити ...

И даже если потоки делают I/O, и поэтому они ждут ввода IO ... Я ожидаю, что нить умрет после ее текущего задача сделана .. но ясно, что Main также перезагружает задания, так как потоки продолжают продолжаться ...

Это поведение наблюдается в perl?

EDIT: Некоторые из кода в mainProgram.pl

use threads; 
use threads::shared; 

for (my $count = 0; $count <= $threadNum-1; $count++) { 
    $t = threads->new(\&handleEvent, $count) ; 
    push(@threads, $t); 
} 

#Parent thread: 
while(1) { 
    lock($parentSignal); 
    cond_wait($parentSignal); 
    getEvents(); 
    while(@eventCount== 0){ 
    sleep($parent_sleep_time); 
    getEvents(); #Try to get events again until you get some new stuff to process 
    } 
    cond_broadcast($threadsDone); # threadsgo work on this 
} 

Благодаря

+0

Какие темы? Perl имеет как минимум две реализации потоков. –

+0

Было бы очень хорошо, если бы вы могли опубликовать пример * runnable *, чтобы мы могли проверить проблему. Без такого кода остаются только вопросы: откуда происходит 'getEvents'? Почему вы используете общие переменные вместо семафоров для связи? Каково содержимое 'handle_Event'? – amon

+1

Что произойдет, если вы попытаетесь убить PID, а не имя файла, процесса? В конце концов, kill -9 нельзя избежать. Я бы сказал, что вы делаете это неправильно. – pilcrow

ответ

0

Из того, что я понимаю, вы должны либо join() или detach() на всех потоков перед выходом.

из стручка:

Если программа завершается без всех нитей, имеющие либо присоединились или отдельно, то будет выдано предупреждение.

Источник: http://metacpan.org/pod/threads

Смежные вопросы