Ошибка при использовании ithreads с Memoize

Я только что представил потоки в программе 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;

5
задан stevenl 28 January 2012 в 17:20
поделиться