Acabo de introducir hilos a un programa Perl, donde uno de sus módulos estaba usando Memoize. Recibo este mensaje de error:Error al utilizar ithreads con Memoize
Subproceso 1 terminado anormalmente: función anónima llamada en contexto escalar prohibido; fallando
El error ocurre si tengo ambos hilos y Memoize, pero desaparecerá si quito uno de estos elementos. Pero el problema no es porque Memoize no es seguro para subprocesos: en mi código, todas las memorias se realizan dentro del mismo hilo.
¿Este es un error con Memoize? ¿Hay alguna manera de solucionar este problema? De lo contrario, me desharé de Memoize.
He aquí algunos ejemplos de código para aislar el problema:
use strict;
use warnings;
use threads;
use Thread::Semaphore;
use Memoize;
my $semaphore = Thread::Semaphore->new;
memoize('foo');
sub foo {
return shift;
}
sub invoke_foo {
$semaphore->down; # ensure memoization is thread-safe
my $result = foo(@_);
$semaphore->up;
return $result;
}
my @threads;
foreach (1 .. 5) {
my $t = threads->create(sub { invoke_foo($_) });
push @threads, $t;
}
$_->join foreach @threads;
¿Qué versión de perl está ejecutando? (Preguntando por [este error] (https://rt.perl.org/rt3/Public/Bug/Display.html?id=79996)) – Mat
Estoy usando Strawberry Perl 5.12.3 con Memoize 1.02. No pude reproducir ese error. – stevenl