This is the third installment of my Perl threads experiments. Again, I have something I don't understand and seek advice before perl-bugging it.
The test program below crashes for me on both Linux and Windows when you use an external sort function -- but not if you use an inline sort block. I am using Perl 5.8.4. Any explanations?
#!/usr/bin/perl -w
use strict;
use threads;
$|=1;
sub mycmp { length($b) <=> length($a) }
sub do_one_thread {
my $kid = shift;
warn "kid $kid before sort\n";
my @list = ( 'x', 'yy', 'zzz', 'a', 'bb', 'ccc', 'aaaaa', 'z',
'hello', 's', 'thisisalongname', '1', '2', '3',
'abc', 'xyz', '1234567890', 'm', 'n', 'p' );
for my $j (1..1000) {
# This does not crash
# for my $k (sort { length($b) <=> length($a) } @list) {}
# Yet this does
for my $k (sort mycmp @list) {}
}
warn "kid $kid after sort\n";
}
sub do_threads {
my $nthreads = shift;
my @kids = ();
for my $i (1..$nthreads) {
my $t = threads->new(\&do_one_thread, $i);
warn "parent $$: continue\n";
push(@kids, $t);
}
for my $t (@kids) {
warn "parent $$: waiting for join\n";
$t->join();
warn "parent $$: thread exited\n";
}
}
# do_threads(1); # does not crash
do_threads(2); # crashes