我有一個perl程序,它產生了幾個線程。每個線程處理一些任務(通過觸發其他系統命令等),然後在完成時等待。perl:當主進程死亡時線程不會死亡
一旦所有線程完成,它們會向父進程發送一個信號。父母然後加載新的工作,並通知線程去完成這些新任務。
所以理想的情況下,這個程序將永遠運行。
現在,如果我在命令行中用kill -9 MainProgram.pl
殺死它,它不會被殺死!我看到線程正在運行的工作的輸出,然後我也看到,他們完成後,他們得到新的工作,並繼續和繼續...
我絕對混淆了。如果我做了kill -9 MainProgram.pl
,它應該殺掉全部它擁有的線程,對吧? 不管線程在做什麼......
即使線程正在做I/O,所以他們等待IO完成......我希望線程在其當前任務完成..但很明顯,主要是重新加載工作,因爲線程只是繼續...
這種行爲在Perl中看到?
編輯:一些代碼在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
}
感謝
哪個線程? Perl至少有兩個線程的實現。 –
如果你可以發佈一個* runnable *例子,那麼我們就可以驗證問題了。沒有這樣的代碼,只剩下問題:'getEvents'從哪裏來?爲什麼你使用共享變量而不是信號量進行通信? 'handle_Event'的內容是什麼? – amon
如果您嘗試殺死進程的PID而不是文件名,會發生什麼情況?畢竟kill -9是無法避免的。我會說你做錯了。 – pilcrow