in reply to capturing output of system call inside a thread

You're redirecting STDERR and STDOUT in a multi-threaded environment for logging? That's brave :)

You could try localising STDOUT and STDERR in the thread before calling inner_worker:

local *STDOUT; local *STDERR;

EDIT: Also:

my $thread1 = threads->create ( \&worker, 1, 'sub1.log' ); my $thread2 = threads->create ( \&worker, 2, 'sub2.log' ); my $need_to_continue = 1; while ($need_to_continue) { print "MAIN THREAD IS PRINTING\n"; if ( $thread1->is_running() || $thread2->is_running() ) { sleep 3; } else { $need_to_continue = 0; } } $thread1->join(); $thread2->join(); exit 0;
can be re-written thusly:
my @threads = map {threads->new(\&worker, $_, "sub$_.log")} 1..2; $_->join for @threads; exit 0;
join is a blocking process that waits for the thread to complete.

Replies are listed 'Best First'.
Re^2: capturing output of system call inside a thread
by that_guy (Novice) on Sep 03, 2015 at 15:52 UTC
    Thanks for the reply. I'm fully aware that all for this can be rewritten much more concise. This doesn't solve my problem though. I'm also aware that join is blocking which is why I don't want to join the thread while other thread might be running thus providing the parallel execution of all the threads. I've tried local STDOUT and local STDERR call and it gives strange results as well. Looks like after using it, most of the output goes to the screen for whatever reason.

      I see that your original problem has been resolved, but will still comment on a misunderstanding you appear to have about threading.

      When I say that join is blocking, it blocks only the thread that is calling the join. Because threads are run in parallel and are essentially independent of each other, calling join in one thread has no effect on the processing of any other threads. In fact, because join is blocking, it is preferable for the parent thread to call join on at least one sub-thread as soon as possible, to minimise the resources the parent thread is consuming (and hence making those additional resources available for the sub threads).

      The main point about writing code more concisely is that it makes your program easier to understand and follow. Doing something in 40 lines that can be easily written and understood in 2 lines makes life a lot harder for anyone trying to understand what you're doing. (Do keep in mind the distinction between minimising code and obfuscating code).