Tôi vừa giới thiệu các chủ đề cho một chương trình Perl, trong đó một trong các mô đun của nó đang sử dụng Memoize. Tôi nhận được thông báo lỗi này:Lỗi khi sử dụng ithreads với Memoize
Chủ đề 1 chấm dứt bất thường: Hàm ẩn danh được gọi trong ngữ cảnh vô hướng bị cấm; đứt gãy
Lỗi này xảy ra nếu tôi có cả hai chủ đề và Memoize, nhưng sẽ biến mất nếu tôi mất đi một trong những yếu tố này. Nhưng vấn đề không phải là vì Memoize không phải là chủ đề an toàn - trong mã của tôi, tất cả các ghi nhớ xảy ra trong cùng một chuỗi.
Đây có phải là lỗi với Bản ghi nhớ không? Có cách nào tôi có thể giải quyết vấn đề này không? Nếu không, tôi sẽ loại bỏ Memoize.
Dưới đây là một số mẫu mã để cô lập các vấn đề:
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;
Bạn đang chạy phiên bản perl nào? (Hỏi vì [lỗi này] (https://rt.perl.org/rt3/Public/Bug/Display.html?id=79996).) – Mat
Tôi đang sử dụng Strawberry Perl 5.12.3 với Memoize 1.02. Tôi không thể tái tạo lỗi đó. – stevenl