My immediate expectation is that when you redirect the output it buffers it, allowing thread 1 to complete the entire workload before thread 2 has had a chance to start (threads take a long time to start in Perl, due to their heavy nature). Yes, the output is also buffered when printing to STDOUT, but \n forces a buffer flush in this instance. You can very easily test this by chucking a sleep into your loop.
Beyond this, I'm not quite sure why you're threading, however a slightly different method of doing the same thing (without having to worry about the dangers of share'ing and lock'ing data structures) would be to use Thread::Queue to pass what is currently being contained in your array.
A solution using Thread::Queue might look something like this:
Note: code untesteduse strict; use warnings; use threads; use Thread::Queue; my $queue = Thread::Queue->new(); my @threads = map {threads->new(\&worker)} 1..2; my @array = qw(2.1.1.1:1.3.1.8.1 ... 2.1.1.1:1.3.1.8.199); $queue->enqueue(@array); # Give work to threads after threads created $queue->end(); # Must do this, otherwise threads will never +end $_->join for @threads; # Join threads to avoid thread errors at end of + script sub worker { my $tid = threads->tid(); print "Starting thread $tid\n"; while (my $oid = $queue->dequeue()) { print "Thread $tid: Doing SNMP GET for $oid\n"; } print "Finishing thread $tid\n"; }
In reply to Re: Redirecting output in Windows cmd prevents second thread from doing anything
by SimonPratt
in thread Redirecting output in Windows cmd prevents second thread from doing anything
by perluser09
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |