Ниже код должен запускать 2 параллельных потока, каждый поток выполняет fork (), ожидает завершения дочернего процесса, затем ожидается, что потоки присоединятся (завершить), и результат будет напечатан. В действительности, первый разветвленный дочерний процесс завершается, как и ожидалось, но второй зависает при _mutex_lock (), пытающемся выйти, поэтому второй поток никогда не присоединяется, пока вы не убьете второго потомка вручную с сигналом -9. Может кто-нибудь объяснить, почему это происходит и как этого избежать?
use strict;
use warnings;
use threads;
use Data::Dumper;
sub Run
{
my $tid = threads->tid();
my $log = {};
$log->{"[$$:$tid]:00"} = "started";
my $pid = fork();
if ($pid == 0)
{
print "In child ($$): started\n";
sleep 3;
print "In child ($$): finished\n";
# system("kill -9 $$"); -- brutal way
exit 0;
}
waitpid($pid, 0);
my $exitCode = $? >> 8;
$log->{"[$$:$tid]:01"} = "finished, code=$exitCode";
return $log;
}
my @threads = ();
foreach (1..2)
{
push @threads, threads->new(sub { return Run() });
}
print Dumper($_->join()) for @threads;