Я только что представил потоки в программе Perl, где один из ее модулей использовал Memoize . Я получаю это сообщение об ошибке:
Поток 1 завершился ненормально: анонимная функция вызывается в запрещенном скалярном контексте; faulting
Ошибка возникает, если у меня есть и потоки, и Memoize, но исчезнет, если я уберу один из этих элементов. Но проблема не в том, что Memoize не является потокобезопасным - в моем коде вся мемоизация происходит в одном потоке.
Это ошибка Memoize? Есть ли способ обойти это? В противном случае я избавлюсь от Memoize.
Вот пример кода для выявления проблемы:
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;