Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^2: Threads and print

by sandy1028 (Sexton)
on Apr 16, 2009 at 09:52 UTC ( [id://757919] : note . print w/replies, xml ) Need Help??


in reply to Re: Threads and print
in thread Threads and print

Can you please tell me how to create single log file per thread and the values are in sequence order.

Replies are listed 'Best First'.
Re^3: Threads and print
by cdarke (Prior) on Apr 16, 2009 at 11:40 UTC
    '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.
      Hi, Here I used the code for writing into single log file.
      But the threads are not printing the "Processesing file" in sequence order and the lines overlap even if I use lock. How can i avoid this?
      #! perl -slw use strict; use threads; use threads::shared; our $from=1; our $to=400020; our $t=5; sub worker { my $tid = threads->tid; # my( $log, $semRef, $from, $to ) = @_; my( $log, $semRef, $from, $step, $to ) = @_; for (my $file = $from ; $file <= $to ; $file += $step) { lock $$semRef; printf $log "The threads is [%2d] Processesing file%3d\n",$tid, $file +; } } ## 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, '>', 'myLog' or die $!; my @threads = map{ threads->create( \&worker, $log, \$logSem, $from + ($_ - 1), $t, $to +) ; } 1 .. $t ; ## Wait till they are done $_->join for @threads; ## close the log close $log;
      The threads is [ 1] Processesing file16436 The threads is [ 1] Processesing file16441 The threads is [ 1] Processesing file 2] Processesing file2462 The threads is [ 2] Processesing file2467 The threads is [ 2] Processesing file2472
      In place of print $log ("The threads is $tid Processing file, $file"); How to print the file names of the directory.
      #! perl -slw use strict; use threads; use threads::shared; our $N ||= 100; our $t=5; our $from=1; our $filenames; sub worker { my $tid = threads->tid; # my( $log, $semRef, $from, $to ) = @_; my( $log, $semRef, $from, $step, $to ) = @_; for (my $file = $from ; $file <= $to ; $file += $step) { lock $$semRef; print $log ("The threads is $tid Processing file, $file"); } } ## 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, ">myLog" or die $!; my @threads = map{ threads->create( \&worker, $log, \$logSem, $from + ($_ - 1), $t, $to +) ; } 1 .. $t ; ## Wait till they are done $_->join for @threads; ## close the log close $log;