Perlプログラムにスレッドを導入しました。そのモジュールの1つがMemoizeを使用していました。 私は、このエラーメッセージが出てい:Memoizeでithreadを使用するとエラーが発生する
スレッド1が異常終了:禁断のスカラコンテキストで呼び出される匿名関数を、エラー
これらの要素の1つを取り除くと、スレッドとメモ帳の両方がある場合にエラーが発生しますが、消えてしまいます。しかし、問題は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;
実行中のPerlのバージョンは? ([このバグ](https://rt.perl.org/rt3/Public/Bug/Display.html?id=79996)のため)。 – Mat
私はMemoize 1.02でStrawberry Perl 5.12.3を使用しています。私はそのバグを再現できませんでした。 – stevenl