2013-08-30 317 views
0

我有一個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 
} 

感謝

+0

哪個線程? Perl至少有兩個線程的實現。 –

+0

如果你可以發佈一個* runnable *例子,那麼我們就可以驗證問題了。沒有這樣的代碼,只剩下問題:'getEvents'從哪裏來?爲什麼你使用共享變量而不是信號量進行通信? 'handle_Event'的內容是什麼? – amon

+1

如果您嘗試殺死進程的PID而不是文件名,會發生什麼情況?畢竟kill -9是無法避免的。我會說你做錯了。 – pilcrow

回答

0

據我瞭解,你應該或者在所有線程join()detach()退出之前。

從POD:

如果程序退出而不具有或者已經加入或脫離 所有線程,那麼將發出警告。

來源:http://metacpan.org/pod/threads