Perl - 将线程变量传递给子例程以创建它

时间:2013-10-04 02:09:50

标签: perl thread-safety subroutine

我正在尝试创建并稍后在perl脚本的主要部分中加入一个线程,但是在子例程中创建线程,该子例程接受参数并在传入的命令中添加一些额外的xterm参数。返回线程名称(ID?)会不会更好?

这是子程序

sub run_thread{
  my $thread_name = $_[0];
  my $cmd = $_[1];
  $thread_name = threads->create({'void' => 1},
    sub { print("\n$cmd\n"); system($xterm . '-T "' . $cmd . '" -e ' . $cmd) });
}

在主要内容我想像这样调用sub:

my $thr1;    
run_thread($thr1, "pwd");
...
$thr1->join();

这不起作用,在某种程度上可能在许多层面上都是错误的。错误是:

Use of uninitialized value $_[0] in concatenation (.) or string at line 37.
Can't call method "join" on an undefined value at line 21.

我通过参考传递并返回,但不确定最好的方式。请帮忙。

1 个答案:

答案 0 :(得分:3)

我认为你的意思是

sub run_thread {
   my (undef, $cmd) = @_;
   $_[0] = threads->create(...);
}

run_thread(my $thread, ...);
$thread->join();

(分配给参数而不是复制参数(undef)的变量($thr)。)

但是为什么要通过参数返回值?返回它会更有意义。

sub run_thread {
   my ($cmd) = @_;
   return threads->create(...);
}

my $thread = run_thread(...);
$thread->join();