in reply to Threads join vs detach

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$..$/