Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Threads and print

by sandy1028 (Sexton)
on Apr 16, 2009 at 06:47 UTC ( [id://757860] : perlquestion . print w/replies, xml ) Need Help??

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

Hi, Here in the for loop, the values passed is between 1 to 200000.
In the log file only 600 values are printed. How can I print all the values in the log file by creating 5 threads.
#! perl -slw use strict; use threads; use threads::shared; our $N ||= 100; our $from=1; our $to=200000; sub worker { my $tid = threads->tid; my( $log, $semRef, $from, $to ) = @_; for my $file ( $from .. $to ) { ## Simulate doing some processing ## Lock the log file semaphore before writing lock $$semRef; ## And write to the log printf $log "[%2d] Processesing file%3d\n", $tid, $file; ## The lock is released automatically at the end of the block } } ## A shared variable used as a semaphore for the log file resource my $logSem :shared; ## Open the log file in the main thread open my $log, '>', 'myLog2' or die $!; my @threads = map{ ## create the workers passing the log file handle and semaphore threads->create( \&worker, $log, \$logSem,$_*$N, $_*$N + $N -1); } 0 .. 5; ## 5 threads each processing 100 "files" ## Wait till they are done $_->join for @threads; ## close the log close $log;

Replies are listed 'Best First'.
Re: Threads and print
by cdarke (Prior) on Apr 16, 2009 at 08:24 UTC
    By correcting your calculation of $N.
    $N = $to/5;
    However, you still have an issue because the records overlap. Didn't we discuss this before here 755631? I suggest you use a single thread to write to the log file, rather than trying to get all the threads to write at the same time.
      Can you please tell me some tutorial regarding it. Like how to create a single log file for each thread. It the $to value is increased also only 5 threads should be created.
        The above code works fine with commenting lock $$semRef; Can anyone please explain me what is the use of locking method in the above code.
Re: Threads and print
by gone2015 (Deacon) on Apr 16, 2009 at 08:53 UTC

    my @threads = map { ## create the workers passing the log file handle and semaphore threads->create( \&worker, $log, \$logSem,$_*$N, $_*$N + $N -1); } 0 .. 5; ## 5 threads each processing 100 "files"
    ...<hem>that's 6 threads, shirly ?

    To process $from..$to in $t threads, how about:

    my @threads = map{ threads->create( \&worker, $log, \$logSem, $from + ($_ - 1), $t, $to +) ; } 1 .. $t ;
    and in the thread:
    my( $log, $semRef, $from, $step, $to ) = @_; for (my $file = $from ; $file <= $to ; $file += $step) { ...... } ;
    which deals with the number of files not being an exact multiple of the number of threads, and copes with $from..$to range where $from is not zero and $to is included in the range...

      Can you please tell me how to create single log file per thread and the values are in sequence order.
        'ang about gov'ner, I thought you wanted to have all the threads writing to the same log file? No? OK, then open a new log file in the worker function. Use some unique value passed as a parameter as part of the file name.