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

I'm trying to teach myself a little more about threading subroutines and I'm confused by the difference of join vs detached. Using the following example can anyone shed some light on the difference?
use warnings; use strict; use threads; use threads::shared; #use Time::HiRes; #my $t0 = Time::HiRes::time; my @array : shared; for (1..50) { push @array, $_; } my $thr = threads->create(\&spawnThread); my $thr2 = threads->create(\&spawnThread); my $thr3 = threads->create(\&spawnThread); my $thr4 = threads->create(\&spawnThread); my $thr5 = threads->create(\&spawnThread); $thr->join(); $thr2->join(); $thr3->join(); $thr4->join(); $thr5->join(); #my $t1 = Time::HiRes::time; #my $elapsed = $t1 - $t0; #print "\nElapsed Time: $elapsed\n"; sub spawnThread { for(1..10) { my $index = shift @array; print "$_ => $index\n"; } }
Thanks

Replies are listed 'Best First'.
Re: Threads join vs detach
by liverpole (Monsignor) on Jan 26, 2007 at 16:22 UTC
    Very simply -- you use join if you care about what value the thread returns when it's done.  You use detach if you don't.

    For example, if you modify your code to return a random integer from 1 to 100 (in spawnThread), you could then make use of that value from the parent thread:

    use warnings; use strict; use threads; use threads::shared; #use Time::HiRes; #my $t0 = Time::HiRes::time; my @array : shared; for (1..50) { push @array, $_; } my $thr = threads->create(\&spawnThread); my $thr2 = threads->create(\&spawnThread); my $thr3 = threads->create(\&spawnThread); my $thr4 = threads->create(\&spawnThread); my $thr5 = threads->create(\&spawnThread); printf "Result = %d\n", $thr->join(); printf "Result = %d\n", $thr2->join(); printf "Result = %d\n", $thr3->join(); printf "Result = %d\n", $thr4->join(); printf "Result = %d\n", $thr5->join(); #my $t1 = Time::HiRes::time; #my $elapsed = $t1 - $t0; #print "\nElapsed Time: $elapsed\n"; sub spawnThread { for(1..10) { my $index = shift @array; print "$_ => $index\n"; } return int rand(100); }

    Prints something like:

    1 => 1 1 => 2 1 => 3 1 => 4 1 => 5 . . . 1 => 41 2 => 42 3 => 43 4 => 44 5 => 45 6 => 46 7 => 47 8 => 48 9 => 49 10 => 50 Result = 89 Result = 51 Result = 71 Result = 15 Result = 7

    However in your original program, you weren't doing anything with the return value (in fact, you weren't even explicitly returning anything), so it would have been perfectly safe to call detach() on any or all of the threads, to avoid having to manage them further.


    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
Re: Threads join vs detach
by zentara (Cardinal) on Jan 26, 2007 at 17:04 UTC
    Another basic point to remember about threads, is that a thread needs to reach the end of it's code block, or return, before it can be joined. Also a detached thread needs to return, or reach code end, before it will succesfully close. If you don't account for this, you get the error "a thread closed while x number were still running". This is harmless, but it is caused by threads not returning, before the main program exits.

    If your threads are running loops that don't have a definite completion point, you can used shared variables, to signal it to drop what it's doing, and return immediately.


    I'm not really a human, but I play one on earth. Cogito ergo sum a bum
Re: Threads join vs detach
by BrowserUk (Patriarch) on Jan 26, 2007 at 23:00 UTC

    One important difference between detaching and joining threads, (besides the return value which I've rarely found a need for), is that once you detach a thread, there is no architected way for the rest of your code to find out if that detched thread has terminated or not.

    It means that if you detach threads, you will have to provide your own mechanism for detecting if they are still running, or risk terminating your program before they've stopped and receiving the "NN threads still running" warning.


    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.