我有一个perl脚本,它通过不同线程中的文件和进程文件队列:
填写文件队列后,下面是一个片段。 问题是,有时当我让它运行太久(12-24小时)时,我会回来看剧本。
我有每个线程的日志文件,我看到活动的最后一个时间戳对于所有这些都是相同的。但是脚本没有退出,这意味着线程不会返回信号量。 此外,我确信线程没有正确结束,因为我仍然可以看到队列中充满了要处理的文件。
我在调用EXE之前和之后都有一个日志,最后一个跟踪始终是调用EXE后的跟踪。无法找到合理的解释。
#initiate all threads
for( my $i = 0; $i < $max_thread; $i++ )
{
my $my_thread = threads->new( sub { start() } );
push( @Threads, $my_thread );
}
$semaphore->down($max_thread);
terminate();
sub start
{
$SIG{INT} = sub { thread_exit() };
while( (my $file = $file_queue->dequeue_nb) )
{
#This function calls an external EXE
processFile( $file );
}
#Thread ended
$semaphore->up();
}
答案 0 :(得分:0)
如果你的线程中抛出了未捕获的异常,那么信号量永远不会被“upped”。看起来您正在使用信号量等待线程退出,这可以使用$thread->join
更安全地完成。
假设你对退出的主题是正确的。它也可能是线程停滞(例如死锁)或进入无限循环。