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
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.