【发布时间】:2011-05-03 10:47:41
【问题描述】:
如果我通过 SSH 远程运行以下简单 Perl 脚本,我无法理解它的行为。
use strict;
use warnings;
use threads;
use threads::shared;
use POSIX;
my $print_mutex : shared;
################################################################################
sub _print($)
{
my $str = shift;
lock($print_mutex);
my $id = threads->tid();
my $time = strftime('%H:%M:%S', localtime time);
print "$time [$id] $str";
return;
}
################################################################################
sub run()
{
for my $i (1 .. 3)
{
_print("Begin $i\n");
sleep 1;
_print("End $i\n");
}
return threads->tid();
}
################################################################################
_print "Starting test.\n";
my @threads;
for my $thr_num (1 .. 2)
{
my $thr = threads->create('run');
push @threads, $thr;
_print "Thread created.\n";
}
foreach (@threads)
{
my $id = $_->join;
_print "Thread '$id' finished.\n";
}
_print "Test finished.\n";
################################################################################
当我使用 Perl-5.10.0 在我的 Linux 机器上正常运行它时,我得到了预期的结果:
$ perl /tmp/a.pl 14:25:54 [0] 开始测试。 14:25:54 [0] 线程已创建。 14:25:54 [1] 开始 1 14:25:54 [0] 线程已创建。 14:25:54 [2] 开始 1 14:25:55 [1] 结束 1 14:25:55 [1] 开始 2 14:25:55 [2] 结束 1 14:25:55 [2] 开始 2 14:25:56 [1] 结束 2 14:25:56 [1] 开始 3 14:25:56 [2] 结束 2 14:25:56 [2] 开始 3 14:25:57 [1] 结束 3 14:25:57 [0] 线程 '1' 完成。 14:25:57 [2] 结束 3 14:25:57 [0] 线程 '2' 完成。 14:25:57 [0] 测试完成。 $但是,当我通过 SSH(在同一本地主机上,但没关系)运行它时,我得到了非常奇怪的结果(仔细查看时间戳和线程 ID):
$ ssh localhost 'perl /tmp/a.pl' 14:26:11 [0] 开始测试。 14:26:11 [0] 线程已创建。 14:26:11 [1] 开始 1 14:26:12 [1] 结束 1 14:26:12 [1] 开始 2 14:26:13 [1] 结束 2 14:26:13 [1] 开始 3 14:26:14 [1] 结束 3 14:26:11 [2] 开始 1 14:26:12 [2] 结束 1 14:26:12 [2] 开始 2 14:26:13 [2] 结束 2 14:26:13 [2] 开始 3 14:26:14 [2] 结束 3 14:26:11 [0] 线程已创建。 14:26:14 [0] 线程 '1' 完成。 14:26:14 [0] 线程“2”完成。 14:26:14 [0] 测试完成。 $我从未在单线程 Perl 脚本中看到过这种情况,我注意到我在创建第一个线程后就开始看到 I/O 问题。
我能够在 Windows 上使用最新的 Perl-5.12 重现该问题,因此我认为该问题不是 Perl/OS 特定的。
有人可以解释一下这里出了什么问题吗?
【问题讨论】:
标签: multithreading perl ssh io