I managed to remove this problem by closing the dir before throwing all these threads.
Hm. I tried that here and it didn't effect a cure reliably. It would sometimes (mostly), work with small numbers of files (threads), but if I asked it to run a couple of hundred threads it always failed during globals destruction. But when I used a glob, the problem disappeared. (I'll have another go later to confirm my findings!)
As for how to debug it, the watchword with threads is pretty much always the same: simplify.
First I tried a non-threaded version. No trap. Then a one threaded. No trap. Then 10 threads--trap.
So then I tried simplifying the thread proc. Take out everything except
sub threads {
my ($msg, $peerAddr, $peerPort) = @_;
sleep 1;
return [1, $msg];
}
Still traps, so look outside. Replaced the while( readdir ) with while( <DATA> ) { and a list of files that caused a trap and the trap went away.
Put back the full thread proc and a larger DATA section, trap still didn't happen.
Put back the opendir/readdir/closedir. Trap returns.
Try glob. trap disappears again. Bingo!
Update: I just tried building the file list using opendir/readdir/closedir first, and then starting the threads again, and this time it worked fine. Maybe I missed that combination last night.
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|