in reply to Re^2: win32 threads problem
in thread win32 threads problem

I've succeeded in reproducing your error, and the problem turns out to be associated with opendir/readdir/closedir. Regardless of whether the you use globals or lexicals; or whether the directory handle is closed prior to spawning the threads, you get a trap when trying to join the threads. That doesn't make much sense to me, but there we are.

I have a work around. Replace:

opendir (CDIR, $cfgFilesDir) or die; my $file; my $thr; while ($file = readdir(CDIR)) { if ($file =~ /.+?\.properties/) { $thr = threads->create(\&sendRequest, $file, 'localhost', $pee +rPort ); } } closedir (CDIR);

with

while( my $file = <*.properties> ) { ## Check the glob matches your fi +les! my $thr = threads->create(\&sendRequest, $file, 'localhost', $peer +Port ); }

And the global destruction problem will probably go away. At least it does here.

There are other problems in your code that you'll discover if you enable strict.


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.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^4: win32 threads problem
by leonidlm (Pilgrim) on Dec 08, 2008 at 07:42 UTC
    Thank you. I managed to remove this problem by closing the dir before throwing all these threads. How you debugged it ? How you started to suspect in the first place this is the problem ?
    And again, thanks all who helped.
      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.