in reply to Multi threading
If you want to be able to serialise writes to a single log file concurrently from multiple threads of execution, then a locking a simple shared variable will achieve that (using threads & threads::shared):
#! perl -slw use strict; use threads; use threads::shared; our $N ||= 100; sub worker { my $tid = threads->tid; my( $log, $semRef, $from, $to ) = @_; for my $file ( $from .. $to ) { ## Simulate doing some processing sleep 1+rand( 2 ); ## 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, '>', 'myLog' 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 .. 4; ## 5 threads each processing 100 "files" ## Wait till they are done $_->join for @threads; ## close the log close $log;
That's just a simplistic demo of the technique. If it is of interest, and you need help adapting it to your needs, please describe those needs more clearly.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Multi threading
by sandy1028 (Sexton) on Apr 07, 2009 at 05:10 UTC | |
by BrowserUk (Patriarch) on Apr 07, 2009 at 07:16 UTC |