Esta integral puede aproximarse por la suma:
$pi
en la cual pretendemos
guardar el valor final. Observe que la variable $pi
es un recurso
compartido por los $p
hilos que debe ser accedido en exclusión mutua.
Para realizar la práctica es conveniente que,
además de consultar los manuales de threads
y threads::shared
lea el tutorial sobre threads: perldoc perlthrtut
.
Rellene el código que falta en el listado que aparece a continuación:
lhp@nereida:~/Lperl/src/threads$ cat -n pilock.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use threads; 4 use threads::shared; 5 6 { # clausura 7 my $pi : shared = 0; 8 9 sub chunk { 10 my $N = shift; 11 my $numthreads = shift; 12 13 my ($i, $x, $sum, $w); 14 my $id = threads->self()->tid(); 15 $w = 1/$N; 16 $sum = 0; 17 for ($i = $id; $i < $N; $i += $numthreads) { 18 $x = .............; # abcisa 19 $sum += .................; # suma parcial 20 } 21 { 22 lock $pi; 23 $pi += $sum; 24 } 25 print "thread $id: $pi\n"; 26 return $pi; 27 } 28 29 sub postprocess { 30 my $N = shift; 31 return ......; # Retornar valor final 32 } 33 } # clausura 34 35 sub par { 36 my $nt = shift(); 37 my $task = shift; 38 my $post = shift; 39 my @t; # array of tasks 40 my $result; 41 42 for(my $i=1; $i < $nt; $i++) { 43 ................................; # crear threads 44 } 45 $task->(@_); 46 .............................; # sincronizar 47 return $post->(@_); 48 } 49 50 ### main ### 51 my $numthreads = (shift || 2); 52 my $N = (shift || 10000); 53 54 my $result = par($numthreads, \&chunk, \&postprocess, $N, $numthreads); 55 print "$result\n"; lhp@nereida:~/Lperl/src/threads$ ./pilock.pl 8 100000 thread 1: 39270.533168727 thread 3: 78540.566344954 thread 2: 117810.849518681 thread 4: 157080.632694908 thread 7: 196349.665856134 thread 5: 235619.19902986 thread 6: 274888.482198587 thread 0: 314159.265359813 3.14159265359813 lhp@nereida:~/Lperl/src/threads$
Casiano Rodríguez León