【问题标题】:Perl - passing threads variable to subroutine to create itPerl - 将线程变量传递给子例程以创建它
【发布时间】:2013-10-04 02:09:49
【问题描述】:

我正在尝试在 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) });
}

在 main 中我想这样调用 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.

我搞砸了通过引用传递和返回,但不确定最佳方式。请帮忙。

【问题讨论】:

  • create 返回一个对象,而不是一个名称。

标签: perl thread-safety subroutine


【解决方案1】:

我想你是说

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();

【讨论】:

  • 是的,你是对的,返回线程更有意义。你为什么要使用@_?您是说 $_[0] 吗?
  • @_ 对我不起作用,它不断打印出参数的数量。 Perl 5.14.1
  • 那你没有使用我发布的内容。具体来说,您在标量上下文中评估 @_,而我在列表上下文中评估它。
  • 是的,没有意识到括号很重要。
  • 功能等效,是的,但我只是给了你一个为什么我使用的更好的理由。另外两个是@_ 比$_[0] 更容易阅读和输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多