perl中的线程超时

时间:2014-06-23 06:03:29

标签: multithreading perl

我正在编写一个perl脚本,在5秒后退出一个线程,如下所示。但是我无法从if条件打印消息。

脚本的输出是闹钟

如何在线程超时时从父进程打印正确的错误消息。

#!/usr/bin/perl
use strict;
use warnings;
use threads;

my $th   = threads->create( \&sub1 );
my $thid = $th->tid();

eval
{
    $SIG{'KILL'} = sub
    {
        if ( $th->is_running() )
        {
            print "timed out, exiting the thread $thid\n";
            $th->exit();
        }
    };
    alarm(5);
    $th->join();
};

sub sub1
{
    my $i = 0;
    while ( $i == 0 )
    {
    }

}

1 个答案:

答案 0 :(得分:2)

Documentation says

如果您想使用闹钟超时系统调用,则需要使用eval / die对。

或者您可以使用Sys :: SigAction并执行以下操作

use Sys::SigAction qw( timeout_call );
if ( timeout_call( 5 ,sub { $retval = DoSomething( @args ); } )
{
   print "DoSomething() timed out\n" ;
}

编辑:请参阅问题的回答:Perl threads with alarm

另见thread safe alarms的讨论。