Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

What is the correct way to finish multithreaded program?

by Gangabass (Vicar)
on May 05, 2014 at 07:09 UTC ( [id://1085004]=perlquestion: print w/replies, xml ) Need Help??

Gangabass has asked for the wisdom of the Perl Monks concerning the following question:

Hi, Monks

I have some multithreaded code which gives me warnings at the end:
Perl exited with active threads: 1 running and unjoined 2 finished and unjoined 0 running and detached
my $q = Thread::Queue->new(); my $pq = Thread::Queue->new(); my @threads = map { threads->create( \&worker, $_ ) } ( 1 .. $config->{number_of_t +hreads} ); push @threads, threads->create( \&controller ); my $mech = WWW::Mechanize->new(); $mech->agent_alias("Windows IE 6"); $mech->get( $config->{start_url} ); my @states = find_states($mech); foreach my $state (@states) { process_state($state); } while ( $q->pending() ) { sleep 1; } foreach ( 1 .. $config->{number_of_threads} ) { $q->enqueue(undef); } while ( $pq->pending() ) { sleep 1; } $pq->enqueue(undef); foreach my $thr (@threads) { if ( $thr->is_joinable() ) { $thr->join(); } }
sub process_state() is populating $q queue. Each thread contain something like this:
while ( my $org = $q->dequeue() ) { parse_org( $org, $mech ); $pq->enqueue($org); }
Thanks. Roman

Replies are listed 'Best First'.
Re: What is the correct way to finish multithreaded program?
by moritz (Cardinal) on May 05, 2014 at 08:46 UTC

    While I'm not an expert on threads, I believe this is the problem:

    foreach my $thr (@threads) { if ( $thr->is_joinable() ) { $thr->join(); } }

    You only join the threads that have already finished; instead you should join them all, i.e. wait for them to finish.

      Hmm... According to docs:
      $thr->is_joinable() Returns true if the thread has finished running, is not detached and has not yet been joined. In other words, the thread is ready to be joined, and a call to $thr->join() will not block.
      Previous block of code (while (..) {..}) used to wait threads to finish (I think). But may be I'm wrong :-(

        Previous block of code (while (..) {..}) used to wait threads to finish (I think). But may be I'm wrong :-(

        Maybe, it depends on more code than shown I think :)

        safest way to wait for threads to finish is to actually wait for them to finish :) blockingly  $_->join for threads->list

Re: What is the correct way to finish multithreaded program?
by Anonymous Monk on May 05, 2014 at 08:05 UTC

    Perl exited with active threads: 1 running and unjoined 2 finished and unjoined 0 running and detached

    Can you describe what this means?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1085004]
Approved by davido
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (2)
As of 2024-03-19 06:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found