PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mittels Threads in datei schreiben


freeze
23.08.2006, 14:28
Hello @all,

Ich möchte beispielsweise mittels 10 Threads in eine Datei bzw. 10 Dateien schreiben. Hier habe ich das Problem das dies nicht mit Threads funktioniert.


for(my $k = 1; $k < $def_max_threads; $k++) {
my $char = undef;
$char = chr(rand(256)+0) if(defined $use_random_char);
$char = $use_char if(defined $use_char);

$thread_count++;
my $thr = threads->new(
sub{
DoJob($filename,
$char,
($max_bytes/$def_max_threads,
$k,
\$j
)
)
}
);
if($k == $def_max_threads) {
my $thr->join;
}
else {
if(defined $detach) { print "Joining Thread\n"; $thr->join; }
elsif(not defined $detach) { print "Thread were detached\n"; $thr->detach; }
}
}

sub DoJob {
# Write data to file
my $fn = shift;
my $char = shift;
my $max_count = shift;
my $info = shift;
my $jj = shift;

$filename .= $fn . "_" . $info;
open my $fh, ">$filename" or last;
print "T$info: Create file\n";
print "T$info: I'am doing a job for Thread $info\n";
print "T$info: I have to write $max_count bytes\n";
for(my $i = 0; $i < $max_count; $i++) {
print " => T$info: Write to file\n";
print $fh, $char;
}
print "T$info: Job for Thread #$info finished\n";
close $fh;
$j++;
$jj++;
$thread_count--;
}


Kann mir diesbezüglich jemand helfen?

Vielen Dank im Voraus
Lg _freeze_


Jan Krüger
23.08.2006, 15:56
Was genau "funktioniert nicht"?
Es ist übrigens nicht die beste Idee, in jedem Schleifendurchlauf "join" zu benutzen. Dadurch wird nämlich an genau der Stelle gewartet, bis der entsprechende Thread fertig ist; effektiv laufen die Threads in diesem Code also nacheinander (es sei denn, $detach ist nicht definiert).
$k == $def_max_threads (if-Bedingung) kann übrigens auf Grund der Schleifenbedingung nicht eintreten, und "my $thr->join" ist relativ merkwürdig. Zu guter Letzt übergibst du den letzten Parameter zu DoJob als Referenz, behandelst ihn dann aber als normalen Integer-Skalar — das kann auch nicht gehen.