multithreading - Compartir una variable de subproceso sin hacerlo global(Perl)
scope lexical-scope (2)
Pase una referencia a ella como argumento.
sub do_something {
my ($id, $lock_ref) = @_;
print("$id: Started/n");
{
lock $$lock_ref;
print("$id: Exclusive/n");
sleep(1);
}
print("$id: done./n");
}
{
my $lock :shared;
for my $id (1..5) {
async { do_something($id, /$lock); };
}
}
O amplíelo para que solo los subs trabajadores puedan verlo.
{
my $lock :shared;
sub do_something {
my ($id) = @_;
print("$id: Started/n");
{
lock $lock;
print("$id: Exclusive/n");
sleep(1);
}
print("$id: done./n");
}
}
for my $id (1..5) {
async { do_something($id); };
}
Intento escribir un script simple que use threads y comparta una variable, pero no quiero hacer que esta variable sea global para todo el script. A continuación se muestra un ejemplo simplificado.
use strict;
use warnings;
use threads;
use threads::shared;
my $val:shared;
# Create threads
for my $i (1 .. 5) {
threads->create(/&do_something, $i);
}
# Wait for all threads to complete
map { $_->join(); } threads->list();
# $val is global to the script so this line will work!
print "VAL IS: $val/n";
sub do_something {
my $i = shift;
print "Doing something with thread $i!/n";
{
lock $val;
$val = "SOMETHING IS $i";
print "$val/n/n";
}
}
Salida:
¡Haciendo algo con el hilo 1! ALGO ES 1
¡Haciendo algo con el hilo 2! ALGO ES 2
¡Haciendo algo con thread 3! ALGO ES 3
¡Haciendo algo con thread 4! ALGO ES 4
¡Haciendo algo con thread 5! ALGO ES 5
VAL ES: ALGO ES 5
¿Cómo puedo obtener este efecto sin hacer que $val
accesible para todo el script? En otras palabras, ¿cómo puedo hacer para intentar imprimir VAL IS: $val
fallará, pero la variable aún será compartida con éxito por los hilos?
No puedo definirlo así:
# Create threads
for my $i (1 .. 5) {
my $val:shared;
threads->create(/&do_something, $i);
}
O obtendré:
El símbolo global "$ val" requiere un paquete explícito
¿Cuál es la forma correcta de alcanzar léxicamente una variable compartida?
Puede limitar el alcance de la variable compartida (asegúrese de que perl vea la variable compartida antes de la creación del hilo),
# ..
{
my $val:shared;
sub do_something {
my $i = shift;
print "Doing something with thread $i!/n";
{
lock $val;
$val = "SOMETHING IS $i";
print "$val/n/n";
}
}
}
# Create threads
for my $i (1 .. 5) {
threads->create(/&do_something, $i);
}
# ...