1
我有一個看似簡單的問題。我需要並行執行一系列的 系統命令(使用反引號)。在系統命令中超時線程
下面的代碼已經被剝奪了任何有意義的東西,除了 證明我的問題:
#!/usr/bin/perl -w
use strict;
use threads;
use POSIX;
my @threads =();
sub timeout {
print "TIMEOUT\n";
foreach my $thread (@threads) {
$thread->kill("ALRM") if $thread->is_running();
}
}
POSIX::sigaction(SIGALRM, POSIX::SigAction->new(\&timeout));
alarm(2);
sub threadsub {
sub handletimeout {
print "KILL\n";
threads->exit(1);
}
POSIX::sigaction(SIGALRM, POSIX::SigAction->new(\&handletimeout));
# while(1) { sleep(1); }
return `sleep 10`;
}
for(my $i=0; $i < 10; $i++) {
push(@threads, thread->create(\&threadsub));
}
foreach my $thread (@threads) {
my $res = $thread->join();
}
現在的問題是發送到線程ALRM信號從不 抓到當線程被阻塞在系統呼叫。如果您取消註釋 while循環信號按預期捕獲。 如何使這項工作,使我能夠超時我的線程,即使 他們卡在系統命令?
感謝,
卡斯帕
作爲解決方法我現在已經成功地使用了一個來自threads :: shared的條件變量。然後,我可以在主線程中保持中斷處理,並在cond_wait而不是$ thread-> join()中使用此塊。在超時時間之後,我使用分離功能殺死主線程中的線程。我仍然希望上面的代碼工作艱難。 –