我刚刚介绍了一个Perl程序的线程,其中一个模块使用Memoize。 我收到此错误消息:使用ithreads与Memoize时出错
线程1异常终止:在禁止标量上下文中调用的匿名函数;断裂
的错误发生,如果我有两个线程和memoize的,但如果我拿走这些元素之一就会消失。但问题不是因为Memoize不是线程安全的 - 在我的代码中,所有的memoization都发生在同一个线程中。
这是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? (因为[这个bug]的询问(https://rt.perl.org/rt3/Public/Bug/Display.html?id=79996)。) – Mat 2012-01-28 15:08:48
我使用Perl的草莓与5.12.3 1.02 memoize的。我无法重现该错误。 – stevenl 2012-01-28 15:35:38