我剛剛介紹了一個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