Есть проблема с простым 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»;
#####################################################################
---------------------------------------------------------------------
Когда запускаю его на Linux с Perl-5.10 все работает корректно:
$ perl /tmp/a.pl
14:25:54 [0] Starting test.
14:25:54 [0] Thread created.
14:25:54 [1] Begin 1
14:25:54 [0] Thread created.
14:25:54 [2] Begin 1
14:25:55 [1] End 1
14:25:55 [1] Begin 2
14:25:55 [2] End 1
14:25:55 [2] Begin 2
14:25:56 [1] End 2
14:25:56 [1] Begin 3
14:25:56 [2] End 2
14:25:56 [2] Begin 3
14:25:57 [1] End 3
14:25:57 [0] Thread '1' finished.
14:25:57 [2] End 3
14:25:57 [0] Thread '2' finished.
14:25:57 [0] Test finished.
$
А вот когда я запускаю этот же скрипт через SSH, то вижу какой-то бред (смотрите на таймстампы и ID потоков):
$ ssh localhost 'perl /tmp/a.pl'
14:26:11 [0] Starting test.
14:26:11 [0] Thread created.
14:26:11 [1] Begin 1
14:26:12 [1] End 1
14:26:12 [1] Begin 2
14:26:13 [1] End 2
14:26:13 [1] Begin 3
14:26:14 [1] End 3
14:26:11 [2] Begin 1
14:26:12 [2] End 1
14:26:12 [2] Begin 2
14:26:13 [2] End 2
14:26:13 [2] Begin 3
14:26:14 [2] End 3
14:26:11 [0] Thread created.
14:26:14 [0] Thread '1' finished.
14:26:14 [0] Thread '2' finished.
14:26:14 [0] Test finished.
$
Никогда не видел ничего подобного на однопоточных Perl-скриптах и заметил что проблема с I/O начинается после создания первого потока.
Проверял этот же скрипт на Windows с Perl-5.12 и получил те же результаты. Так что похоже что проблема не с конкретной версией Perl или OS.
В чем тут дело?