1

我的程序是这样的:

use strict;
use threads;
use threads::shared;

my @thr;
for (my $i = 0; $i < $ARGV[0]; $i++) {
    $thr[$i] = threads->create(\&Iteration, $i);
}

foreach (@thr) {
    if ($_->is_running()) {
        print "no";
    }
    else{
        $_->join;
    }
}

sub Iteration {
    my $in = shift;
    print "test$in\n";
}

但是当我用 $ARGV[0] 运行它时,比如 5,输出是

test2
test1
test0
test3
test4
Can't locate auto/threads/is_running.al in @INC 

那么,如何使用 is_running() 语句来检查我的一个线程的状态?

4

2 回答 2

1

看起来不错。该消息表明 sub 不存在,因此我怀疑您使用的是旧版本的线程,它没有这种方法。如果是这样,只需升级您的线程模块。

cpan threads

以下应该为您提供您已安装的版本(当前为 1.86,is_running似乎已添加到 1.34):

perl -Mthreads -le'print $threads::VERSION'

以下内容应为您提供已安装版本的文档:

perldoc threads
于 2012-09-24T17:59:46.620 回答
1

如果您真的无法升级,您可以is_running使用线程 ID 的共享表自己实现类似簿记。就像是:

package Untested::Workaround;
#
# my $thr = Untested::Workaround->spawn(\&routine, @args);
# ...
# if (Untested::Workaround->is_running($thr)) ...
#
#
...
our %Running : shared;        # Keys are "running" tids

sub _bookkeeping {
  my ($start_routine, @user_args) = @_;
  my $ret;

  { lock(%Running); $Running{ threads->tid() } = 1; }
  $ret = $code->(@args);
  { lock(%Running); delete $Running{ threads->tid() }; }

  $ret;
}

sub spawn {
  shift; #ignore class
  threads->create(\&_bookkeeping, @_);
}

sub is_running { lock %Running; $Running{ $_[1]->tid() }; }

上述内容再次未经测试。它可以被改进,要么继承threads或修改threads' 命名空间以提供更现代、更自然的 API。(它也忽略了调用者上下文,它threads保留了它的启动例程。)

于 2012-09-24T18:38:35.103 回答