in reply to Re: Thread detach
in thread Thread detach

Thank you very much. Adding a sleep at the end of my code solved the problem. The actual problem I'm trying to solve is running multiple threads on a system with 4 processors. I don't want the actual number of running threads to be larger then the processors. Each thread is a calculation and it is not possible to predict how long it will take. My model code is:
use threads; use Thread::Semaphore; my $semaphore = Thread::Semaphore->new(4); # max number of proccesors + to use for $i (1..10) { my $thr = threads->new(\&sub1, $i); $thr->detach(); } sleep 20; sub sub1 { $semaphore->down(1); $tn = shift; print "thread $tn is working\n"; $s = int(rand 4) +1; # a long calculation sleep $s; $semaphore->up(1); }
Can you suggest a more inteligent way to prevent the main thread from finishing. Thanks in advance.

Replies are listed 'Best First'.
Re^3: Thread detach
by BrowserUk (Patriarch) on Jan 24, 2005 at 23:37 UTC
    Can you suggest a more inteligent way to prevent the main thread from finishing.

    If all you need to do in your main thread is wait until all your other threads have finished, then don't detach them and use join in the main thread.

    #! perl -slw use strict; use threads; sub slowProcess { my( $count ) = @_; while( --$count and sleep 1 ) { print threads->self->tid(), " : $count"; } } my @threads = map{ threads->create( \&slowProcess, 1+int rand 10 ) } 1 .. 10; $_->join for @threads;

    There is a caveat with this in that if the first thread you created is the last thread to finish, then the resources used by the other 9 thread will not be freed until the first thread completes, because the code will make no attempt to join the other 9 until the first join returns. In this case, that will probably make no difference to you.


    Examine what is said, not who speaks.
    Silence betokens consent.
    Love the truth but pardon error.