• Publicidad

Compartir variables entre hilos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Compartir variables entre hilos

Notapor p0fk » 2009-06-11 23:19 @013

Hola, soy nuevo en el foro y también en Perl :)

Tengo el siguiente problema: necesito crear n cantidad de hilos y pasar los datos de un array por cada hilo. Leí la documentación de ::shared pero no lo entendí :S , esto es lo que llevo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;

use threads;
use threads::shared;
use Thread qw/async yield/;

#use Thread qw(async);

#no warnings 'threads';



my@dir : shared=qw(
uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
diez

);

system'clear';
my @threads;
for(my $i=0; $i<3; $i++){
        push(@threads, threads->new(\&SCAN));  
}

foreach my $thr (@threads){
        $thr->join();  
}


sub SCAN{
foreach my$scan(@dir){
my $tid = Thread->self->tid;
print"N hilo: $tid\t".$scan."\n";
}}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El resultado:
Código: Seleccionar todo
N hilo: 1       uno
N hilo: 1       dos
N hilo: 1       tres
N hilo: 1       cuatro
N hilo: 1       cinco
N hilo: 1       seis
N hilo: 1       siete
N hilo: 1       ocho
N hilo: 1       nueve
N hilo: 1       diez
N hilo: 2       uno
N hilo: 2       dos
N hilo: 2       tres
N hilo: 2       cuatro
N hilo: 2       cinco
N hilo: 2       seis
N hilo: 2       siete
N hilo: 2       ocho
N hilo: 2       nueve
N hilo: 2       diez
N hilo: 3       uno
N hilo: 3       dos
N hilo: 3   tres
N hilo: 3   cuatro
N hilo: 3   cinco
N hilo: 3   seis
N hilo: 3   siete
N hilo: 3   ocho
N hilo: 3   nueve
N hilo: 3   diez


Lo que tendría que pasar acá sería que pasara "uno" al primer hilo, "dos" al hilo 2, "tres" al hilo 3, "cuatro" al hilo 1, y así sucesivamente...

Ojala me puedan ayudar...

¡¡¡Saludos!!!
Última edición por p0fk el 2009-06-12 21:25 @934, editado 1 vez en total
p0fk
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-06-11 22:17 @970

Publicidad

Notapor explorer » 2009-06-12 03:14 @176

Bienvenido a los foros de Perl en Español, p0fk.

Yo lo que veo es que el programa sí que funciona bien... estás creando cuatro hilos, y cada hilo está recorriendo todos los elementos de @dir.

No entiendo lo que dices al final de que el elemento "uno" tenga que "pasar" al hilo 1. ¿Puedes explicarlo de otra manera?

Actualización: haciendo un pequeño cambio, ya se ve el efecto de los hilos, cada uno corriendo a distinta velocidad:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use threads;
use threads::shared;
#use Thread qw/async yield/;
#use Thread qw(async);
#no warnings 'threads';

$|=1;

my@dir : shared = qw(
    uno
    dos
    tres
    cuatro
    cinco
    seis
    siete
    ocho
    nueve
    diez
);

my @threads;

for (0 .. 3) {
    push @threads, threads->create(\&SCAN);
}

sleep 20;

foreach my $hilo (@threads){
    print "esperando por terminación de " . $hilo->tid() , "\n";
    $hilo->join();
}

sub SCAN {
    foreach my $scan (@dir) {
        my $tid = threads->tid();
        my $espera = 3 + int rand 10;
        print"N hilo: $tid\t$scan $espera\n";
        sleep $espera;
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Código: Seleccionar todo
N hilo: 1       uno 12
N hilo: 2       uno 8
N hilo: 3       uno 12
N hilo: 4       uno 11
N hilo: 2       dos 3
N hilo: 2       tres 5
N hilo: 4       dos 8
N hilo: 1       dos 9
N hilo: 3       dos 10
N hilo: 2       cuatro 11
N hilo: 4       tres 5
esperando por terminación de 1
N hilo: 1       tres 5
N hilo: 3       tres 11
N hilo: 4       cuatro 4
N hilo: 1       cuatro 4
N hilo: 2       cinco 3
N hilo: 4       cinco 11
N hilo: 1       cinco 10
N hilo: 2       seis 10
N hilo: 3       cuatro 3
N hilo: 3       cinco 12
N hilo: 4       seis 8
N hilo: 1       seis 3
N hilo: 2       siete 8
N hilo: 1       siete 4
N hilo: 1       ocho 7
N hilo: 4       siete 4
N hilo: 2       ocho 3
N hilo: 3       seis 8
N hilo: 2       nueve 12
N hilo: 4       ocho 6
N hilo: 1       nueve 3
N hilo: 3       siete 6
N hilo: 1       diez 5
N hilo: 4       nueve 9
esperando por terminación de 2
N hilo: 3       ocho 3
N hilo: 2       diez 3
N hilo: 3       nueve 7
esperando por terminación de 3
N hilo: 4       diez 3
N hilo: 3       diez 5
esperando por terminación de 4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor p0fk » 2009-06-12 15:26 @684

mmm pensándolo bien yo tampoco me entendí...
Esto es lo que pretendo hacer:
Código: Seleccionar todo
N hilo: 1       uno
N hilo: 2       dos
N hilo: 3       tres
N hilo: 4       cuatro
N hilo: 1       cinco
N hilo: 2       seis
N hilo: 3       siete
N hilo: 4       ocho
N hilo: 1       nueve
N hilo: 2       diez


¿¿Se puede??
p0fk
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-06-11 22:17 @970

Notapor explorer » 2009-06-12 19:27 @852

Claro que se puede... consiste en "saltarse" elementos dentro de la subrutina que se comparte.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use threads;
use threads::shared;
#use Thread qw/async yield/;
#use Thread qw(async);
#no warnings 'threads';

$|=1;

my@dir : shared = qw(
    uno
    dos
    tres
    cuatro
    cinco
    seis
    siete
    ocho
    nueve
    diez
);

my @threads;

my $num_hilos = 4;

for (0 .. $num_hilos-1) {
    push @threads, threads->create(\&SCAN);
}

sleep 10;

foreach my $hilo (@threads){
    print "esperando por terminación de " . $hilo->tid() , "\n";
    $hilo->join();
}


sub SCAN {
    my $tid = threads->tid();
    my $i = $tid - 1;

    while ( $i < @dir ) {
        my $scan = $dir[$i];
        my $espera = 1 + int rand 5;

        print"N hilo: $tid\t$scan $espera\n";

        sleep $espera;

        $i += $num_hilos;
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Ahora sale:
Código: Seleccionar todo
N hilo: 1       uno 1
N hilo: 2       dos 4
N hilo: 3       tres 2
N hilo: 4       cuatro 3
N hilo: 1       cinco 1
N hilo: 1       nueve 2
N hilo: 3       siete 2
N hilo: 4       ocho 3
N hilo: 2       seis 1
N hilo: 2       diez 1
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor p0fk » 2009-06-12 21:24 @933

Eso era lo que quería :D Muchas gracias por todo.
p0fk
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2009-06-11 22:17 @970


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron