gpt4 book ai didi

multithreading - Perl错误: thread failed to start: Invalid value for shared scalar

转载 作者:行者123 更新时间:2023-12-03 12:49:23 24 4
gpt4 key购买 nike

尝试运行测试代码时出现以下错误:

线程启动失败:./threaded_test.pl 第 47 行的共享标量值无效。

第 47 行是:%hoh = hoh(@new_array);

我的观察:

  • 如果我删除第 47 行和引用 %hoh 的其他行,则脚本运行时不会出现错误
  • 我可以创建一个新的哈希 %new_hash = (itchy => "Scratchy"); 没有错误,但是当我尝试从另一个子(第 47 行)“返回”哈希时,它导致上面的错误。

不幸的是,我无法使用输入/输出队列,因为我使用的 Thread::Queue 版本太旧(并且安装在我无法控制的系统上)并且不支持哈希和哈希引用类型通过队列返回(根据 this )。显然,我的版本仅支持通过队列返回字符串。

有没有办法成功做到这一点:$hash{$string}{"jc"} =\%hoh;

#!/usr/bin/perl
use strict;
use warnings;
use threads;
use Thread::Queue;
use constant NUM_WORKERS => 10;

my @out_array : shared = ();
main();

sub main
{
my @results = test1();
foreach my $item (@results) {
print "item: $item\n";
}
}

sub test1
{
my $my_queue = Thread::Queue->new();
foreach (1..NUM_WORKERS) {
async {
while (my $job = $my_queue->dequeue()) {
test2($job);
}
};
}
my @sentiments = ("Axe Murderer", "Mauler", "Babyface", "Dragon");
$my_queue->enqueue(@sentiments);
$my_queue->enqueue(undef) for 1..NUM_WORKERS;
$_->join() for threads->list();
my @return_array = @out_array;
return @return_array;
}

sub test2
{
my $string = $_[0];
my %hash : shared;
my @new_array : shared;
my %new_hash : shared;
my %hoh : shared;
@new_array = ("tom", "jerry");
%new_hash = (itchy => "Scratchy");
%hoh = hoh(@new_array);
my %anon : shared;

$hash{$string} = \%anon;
$hash{$string}{"Grenade"} = \@new_array;
$hash{$string}{"Pipe bomb"} = \%new_hash;
$hash{$string}{"jc"} = \%hoh;
push @out_array, \%hash;
return;
}

sub hoh
{
my %hoh;
foreach my $item (@_) {
$hoh{"jeepers"}{"creepers"} = $item;
}
return %hoh;
}

最佳答案

问题是您试图存储对共享变量中未共享的内容的引用。您需要像前面提到的那样使用 share,或者需要序列化数据结构。

关于multithreading - Perl错误: thread failed to start: Invalid value for shared scalar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17661821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com