Ho appena introdotto i thread in un programma Perl, in cui uno dei suoi moduli utilizzava Memoize. Viene visualizzato questo messaggio di errore:Errore nell'utilizzo di ithreads con Memoize
Thread 1 terminato in modo anomalo: funzione anonima chiamata nel contesto scalare proibito; faulting
L'errore si verifica se ho entrambi i thread e Memoize, ma scomparirà se togli uno di questi elementi. Ma il problema non è perché Memoize non è thread-safe - nel mio codice, tutta la memoizzazione avviene all'interno della stessa discussione.
Si tratta di un errore di Memoize? C'è un modo per aggirare questo? Altrimenti mi sbarazzerò di Memoize.
Ecco alcuni esempi di codice per isolare il 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;
Quale versione di perl stai utilizzando? (Chiedo a causa di [questo bug] (https://rt.perl.org/rt3/Public/Bug/Display.html?id=79996).) – Mat
Sto usando Strawberry Perl 5.12.3 con Memoize 1.02. Non potrei riprodurre quell'errore. – stevenl