Multithreading 在Perl中使用多线程时,应该如何更新哈希值?

Multithreading 在Perl中使用多线程时,应该如何更新哈希值?,multithreading,perl,hash,threadpool,Multithreading,Perl,Hash,Threadpool,过去几个小时我一直在想办法解决这个问题,现在我真的很困惑 这是我的任务大纲。我应该编写一个Perl子例程来获取对散列的引用 我有另一个子助手,它获取一个内部散列并执行一些操作,包括添加键 sub helper { $href = shift; $href->{NEW_KEY}=1; } 由于每个内部哈希都独立于其他哈希,所以我想使用多线程来调用helper 我使用的是几乎没有任何文档的。我的Perl版本不支持 所以我有这样的想法: sub my_sub { $ho

过去几个小时我一直在想办法解决这个问题,现在我真的很困惑

这是我的任务大纲。我应该编写一个Perl子例程来获取对散列的引用

我有另一个子助手,它获取一个内部散列并执行一些操作,包括添加键

sub helper {
    $href = shift;
    $href->{NEW_KEY}=1;
}
由于每个内部哈希都独立于其他哈希,所以我想使用多线程来调用helper

我使用的是几乎没有任何文档的。我的Perl版本不支持

所以我有这样的想法:

sub my_sub {
    $hohref = shift;

    # create thread pool
    my $pool = Thread::Pool::Simple->new(
        do  => [ \&helper ]
    );

    # submit jobs
    foreach my $hashref ( values %{$hohref} ) {
        $pool->add( $hashref );
    }

    # wait for all threads to end
    $pool->join();
}
关键的一点是,我希望散列的主散列能够反映对内部散列所做的所有更改

my_sub获得对$hohref的非共享引用,因此我尝试在my_sub的正文中创建共享副本:

使用它并返回它,但是内部哈希仍然没有更新

当我使用完全相同的代码,但只是用一个简单的循环替换所有线程池块时

foreach my $hashref ( values %{$hohref} ) {
    helper( $hashref );
}
然后一切正常

非常感谢你的帮助

更新

请参见此可运行示例:

use strict;
use warnings;

use threads;
use threads::shared;

use Thread::Pool::Simple;
use 5.010;

use Data::Dumper;

sub helper {
    say "helper starts";
    my $href  = shift;
    say "href is $href";
    $href->{NEW_KEY} = 1;
    say "helper ends with $href";
}


sub my_sub {
    my $hohref = shift;

    my $shared_hohref = shared_clone $hohref;
    my $pool = Thread::Pool::Simple->new( do => [\&helper] );

    # submit jobs
    foreach my $hashref ( values %{$shared_hohref} ) {
        say "adding to pool: $hashref";
        $pool->add($hashref);
    }

    # wait for all threads to end
    $pool->join();

    return $shared_hohref;
}

my $hoh = {
    A => { NAME => "a" },
    B => { NAME => "bb" }
};

say "1\t", Dumper $hoh;
my $updated_hoh = my_sub($hoh);
say "2\t", Dumper $updated_hoh;
“助手启动”但仅此而已。。。它到底发生了什么事?

请参阅。

请参阅

use strict;
use warnings;

use threads;
use threads::shared;

use Thread::Pool::Simple;
use 5.010;

use Data::Dumper;

sub helper {
    say "helper starts";
    my $href  = shift;
    say "href is $href";
    $href->{NEW_KEY} = 1;
    say "helper ends with $href";
}


sub my_sub {
    my $hohref = shift;

    my $shared_hohref = shared_clone $hohref;
    my $pool = Thread::Pool::Simple->new( do => [\&helper] );

    # submit jobs
    foreach my $hashref ( values %{$shared_hohref} ) {
        say "adding to pool: $hashref";
        $pool->add($hashref);
    }

    # wait for all threads to end
    $pool->join();

    return $shared_hohref;
}

my $hoh = {
    A => { NAME => "a" },
    B => { NAME => "bb" }
};

say "1\t", Dumper $hoh;
my $updated_hoh = my_sub($hoh);
say "2\t", Dumper $updated_hoh;